0

저는 그림 응용 프로그램을 만들고 있습니다. 각 탭에서 일부 핵심 데이터 엔티티가 생성됩니다. 사용자는 실행 취소 버튼을 클릭 할 수 있으며 이러한 클릭은 한 번에 하나씩 취소됩니다. 이것은 잘 작동합니다.코어 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... 

    }]; 
}]; 

답변

0

하나의 아이디어는 당신이 (같은 자식 컨텍스트) 자신의 블록 취소되고 싶어 코드의 각 블록을 둘러싸는 것입니다 :

내 코드입니다. 어쩌면 그것을 두 개의 덩어리로 나누고 작동하는지 확인하십시오.

두 번째 생각으로는 각 저장이 실제로 저장되지 않고 변경 사항을 상위 컨텍스트로 푸시한다고 생각합니다. 그래서 내 생각 엔 부모 컨텍스트가 각 자식을 하나의 실행 취소 가능 이벤트로 저장한다는 것입니다. 어쩌면 당신은 더 자주 저장을 시도 할 수 있습니다 다음이 덩어리가 취소 할 수 있는지보십시오.

+0

당신이 묘사하는 것은 내가 원하는 것입니다. 각 자식 컨텍스트는 하나의 실행 취소 가능한 이벤트로 저장됩니다. 하지만 그렇게 작동하지 않습니다. 각 자식을 저장하면 이전의 모든 작업을 취소 할 수없는 하나의 이벤트로 그룹화하여 문서를 열 때의 상태로 되돌립니다. – Odrakir

+0

그래서? 별도의 컨텍스트를 만드는 첫 번째 전략을 시도 했습니까? – Mundi

+0

내가 당신을 올바르게 이해했다면 그것은 내가하고있는 일이다. 실행 취소 할 수있는 모든 코드 블록은 자체 performBlock 함수 내에 있습니다. 작동하지 않습니다. – Odrakir