2

RestKit을 통해 만든«Picture»라는 NSManagedObject가 있다고 가정 해 봅니다. NSOperation을 통해 실제 사진 파일 콘텐츠를 업로드하고 있습니다. 그 NSOperation 업로드 진행 상황을 추적하고 그림 개체의«진행»특성에 저장합니다.다른 하나가 객체를 삭제하는 동안 컨텍스트가 객체 업데이트를 저장하고있을 때 RestKit에서 CoreData 병합 충돌을 해결합니다.

if(![self isCancelled]) { 
    Picture *pic = [Picture findFirstByAttribute:@"pictureId" withValue:self.pictureId]; 
    if(![pic isDeleted]) { 
     pic.progress = [NSNumber numberWithFloat:progress]; 
     [[RKObjectManager sharedManager].objectStore save:NULL]; 
    } 
} 

내보기 컨트롤러는 NSFetchedResultsController를 사용하여 그림 개체 목록을 표시합니다. 업로드가 잘 작동합니다. RestKit은 스레드 안전을 수행하고 기본 NSManagedObjectContext로 병합하여 UI가 업로드 진행 상황을 예상대로 표시합니다.

사진을 업로드하는 동안 사용자가 그림 개체를 삭제하기로되어있는«취소»십자 기호를 누르면 이제 상상해보십시오. 컨트롤러에서 NSOperation에 대한 취소를 호출합니다. NSOperation은 실제로 밀리 초 내에 작업 실행을 중지하고 개체가 주 스레드의 CoreData에서 삭제됩니다.

[uploadOperation cancel]; 
Picture *pic = [Picture findFirstByAttribute:@"pictureId" withValue:self.pictureId]; 
[pic deleteEntity]; 
[[RKObjectManager sharedManager].objectStore save:NULL]; 

흔적은 예상대로 내 NSFetchedResultsControllerDelegate에 NSFetchedResultsChangeDelete를 얻을 수 있음을 보여준다. NSFetchedResultsChangeInsert와 NSFetchedResultsChangeUpdate가 바로 뒤를 잇습니다. 왜냐하면 NSOperation에 의해 진행 과정이 실제로 저장되기 때문입니다. NSOperation에서 사용하는 NSManagedObjectContext가 동기화되지 않은 것 같습니다. Picture 개체가 삭제되었음을 알지 못합니다. save 호출은 삽입 및 업데이트를 발생시킵니다.

그래서 내 UI (및 DB)에서 내 그림 개체는 삭제해야하는 동안 유지됩니다.

RKManagedObjectStore에서 보면 머지가 백그라운드 스레드 (NSOperation)에서 메인 스레드 (내보기 컨트롤러)로 만들어졌지만 그 반대의 방식은 아닌 것처럼 보입니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

답변

0

Core Data Undo Manager를 사용하는 것이 가장 좋은 상황입니다. 좋은 예가 over here이나 Apple에서 제공 한 CoreDataBooks 예제에서 찾을 수 있습니다.

+0

죽은 링크 "over here" –

+0

@ D.Lovell Thanks, updated. – flashfabrixx

0

아마도 앱의 제어 흐름을 조금 변경해야한다고 생각합니다. NSOperation이 진행되는 동안 주 컨텍스트에서 개체를 삭제하는 것은 좋지 않은 생각처럼 들립니다. 왜 당신은 예를 들어.NSOperation에서 작업이 취소되었는지 확인하고 해당 MOC를 사용하여 이미지 개체를 삭제 했습니까? 그런 식으로 한 어린이 MOC에만 글을 쓸 수 있습니다. 또 다른 대안 인 즉,은 수정 작업을 수행하기 전에 작업에서 하위 MOC를 업데이트하여 별도의 컨텍스트가있는 목적을 무효화합니다.

그것에 대해 생각하면 NSManagedObjectContextObjectsDidChangeNotification을 관찰하고 NSMergePolicy을 적절히 병합하는 영리한 방법이있을 수 있습니다.하지만 다시 생각해 보면 귀하의 경우는 과도하다고 생각합니다. 난 그냥 같은 장소에서 전체 취소 및 삭제를 처리합니다.

+0

그냥이 질문이 1 년 된 것을 깨달았습니다. 오, 아마도 도움이 될 것입니다 ... – DaGaMs