2011-10-24 49 views
1

我異步執行多個請求,每個響應都返回一個xml。我需要提取xml(我使用TBXML解析它)並將其保存在Core Data中。這不能在主線程上完成,因爲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