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)에서 메인 스레드 (내보기 컨트롤러)로 만들어졌지만 그 반대의 방식은 아닌 것처럼 보입니다.
이 문제를 해결하는 가장 좋은 방법은 무엇입니까?
죽은 링크 "over here" –
@ D.Lovell Thanks, updated. – flashfabrixx