2011-10-24 3 views
1

여러 요청을 비동기 적으로 실행하고 각 응답이 xml을 반환합니다. xml (나는 그것을 파싱하기 위해 TBXML을 사용하고있다)을 추출하여 핵심 데이터에 저장해야한다. UI가 너무 느려지므로 주 스레드에서이 작업을 수행 할 수 없습니다. 내가 뭘 각 XML 응답을 다음NSManagedObject에 대한 NSMergeConflict

dispatch_queue_t request_queue = dispatch_queue_create("com.queue.name", NULL); 
dispatch_async(request_queue, ^{ 
     AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
     NSManagedObjectContext *newMOC = [[NSManagedObjectContext alloc] init]; 
     [newMOC setPersistentStoreCoordinator:[appDelegate persistentStoreCoordinator]]; 
     newMOC setUndoManager:nil]; 

     NSNotificationCenter *notify = [NSNotificationCenter defaultCenter]; 
     [notify addObserver:self 
      selector:@selector(mergeChanges:) 
      name:NSManagedObjectContextDidSaveNotification 
      object:newMOC]; 
     [self traverseElement:tbxml.rootXMLElement inMOC:newMOC]; 
     [[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:newMOC]; 
     [newMOC release]; 
}); 
dispatch_release(request_queue); 

- (void)mergeChanges:(NSNotification*)notification 
{ 
    AppDelegate *theDelegate = [[UIApplication sharedApplication] delegate]; 
    [[theDelegate managedObjectContext] performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) withObject:notification 
    waitUntilDone:YES]; 

}는 traverseElement 방법에

, 나는 XML을 구문 분석하고 핵심 데이터에 데이터를 삽입합니다. 이 작업을 실행할 때 아래와 같은 병합 충돌이 많이 발생합니다. 어떤 아이디어가 왜이 문제를 디버깅하기위한 단서가 있습니까? 코어 데이터 모델을 변경하지 않았습니다.

NSMergeConflict for NSManagedObject with objectID '...' 
with oldVersion = 117 and newVersion = 118 and 
old object snapshot = ... and new cached row = ... 
+0

traverseElement가 수행하는 작업에 대한 간단한 설명을 제공 할 수 있습니까? – edsko

답변

1

병합 충돌은 관리되는 개체 컨텍스트에서 변경 내용을 저장할 때 발생하는 충돌을 캡슐화합니다. 영구 저장소 코디네이터 계층에서 관리되는 개체 컨텍스트와 메모리 내 캐시 상태 사이

:

두 개의 충돌이 발생할 수있는 상황이 있습니다. 이 경우 병합 충돌에는 원본 개체와 캐시 된 스냅 숏이 있지만 지속 된 스냅 숏은 없습니다.

영구 저장소 조정자의 캐시 된 상태와 외부 저장소 (파일, 데이터베이스 등) 사이. 이 경우 병합 충돌에는 캐시 된 스냅 샷과 지속 된 스냅 샷이 있습니다.

여기에서 documentation을 참조하십시오.

+1

익명 downvotes - 매우 건설적인> :-( – Mundi

+0

https://developer.apple.com/library/ios/documentation/CoreData/Reference/NSMergeConflict_Class/Reference/Reference.html 인용이 필요합니다 –

+0

@LuongHuyDuc 좋은 지적 - 이것은 오래 동안이었습니다. 나는 그것을 고쳤다.하지만 투표를 내려야 할 필요는 없다. – Mundi

관련 문제