저는 그림 응용 프로그램을 만들고 있습니다. 각 탭에서 일부 핵심 데이터 엔티티가 생성됩니다. 사용자는 실행 취소 버튼을 클릭 할 수 있으며 이러한 클릭은 한 번에 하나씩 취소됩니다. 이것은 잘 작동합니다.코어 performBlock에서 자식 컨텍스트 저장 : 실행 취소 스택을 제거합니다.
일부 자동화 된 작업을 실행하면 문제가 발생합니다. 자식 컨텍스트에서 일련의 핵심 데이터 엔티티 (자체적으로 항목을 그려서)를 만든 후 변경 사항이 주 컨텍스트에 반영되도록 컨텍스트를 저장하는 단추가 있습니다.
문제는 사용자가 작업 버튼을 누르는 횟수에 상관없이 모든 변경 사항이 하나의 단일 실행 취소 단계로 그룹화된다는 것입니다.
그는 5 가지 작업을 한 다음 실행 취소를 한 번 수행하면 처음에 다시 돌아옵니다. 하지만 한 번에 하나씩 각 작업을 실행 취소 할 수 있기를 바랍니다.
저는 UIManagedDocument를 사용하고 있으며 핵심 데이터 스택입니다. 따라서 2 가지 컨텍스트, 하나는 디스크에 쓰고 하나는 일반 용도로 쓰는 것입니다. 그런 다음 백그라운드 작업을 위해 후자의 자식을 만듭니다.
NSManagedObjectContext* childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
childContext.parentContext = self.document.managedObjectContext;
childContext.undoManager = self.document.undoManager;
[childContext performBlock:^{
//a lot of things happen here, that generate many entities
[childContext save:nil];
[self.document.managedObjectContext performBlock:^{
//completion stuff, update UI...
}];
}];
당신이 묘사하는 것은 내가 원하는 것입니다. 각 자식 컨텍스트는 하나의 실행 취소 가능한 이벤트로 저장됩니다. 하지만 그렇게 작동하지 않습니다. 각 자식을 저장하면 이전의 모든 작업을 취소 할 수없는 하나의 이벤트로 그룹화하여 문서를 열 때의 상태로 되돌립니다. – Odrakir
그래서? 별도의 컨텍스트를 만드는 첫 번째 전략을 시도 했습니까? – Mundi
내가 당신을 올바르게 이해했다면 그것은 내가하고있는 일이다. 실행 취소 할 수있는 모든 코드 블록은 자체 performBlock 함수 내에 있습니다. 작동하지 않습니다. – Odrakir