NSMergeConflict for NSManagedObject

时间:2011-10-24 14:33:12

标签: core-data nsmanagedobject

我异步执行多个请求,每个响应返回一个xml。我需要提取xml(我使用TBXML来解析它)并将其保存在Core Data中。这不能在主线程上完成,因为UI会变得太慢。 我正在为每个xml响应执行以下操作:

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并在Core Data中插入数据。 执行此操作时,我遇到了很多合并冲突,如下所示。任何想法为什么或任何线索调试此问题?我没有改变核心数据模型。

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

2 个答案:

答案 0 :(得分:1)

合并冲突会封装尝试保存托管对象上下文中的更改时发生的冲突。

有两种情况可能会发生冲突:

在持久性存储协调器层的托管对象上下文与其内存中缓存状态之间。在这种情况下,合并冲突具有源对象和缓存快照,但没有持久化快照。

持久性存储协调器的缓存状态与外部存储(文件,数据库等)之间。在这种情况下,合并冲突具有缓存快照和持久快照。

请在此处查看documentation

答案 1 :(得分:0)

这可能对您有用:http://www.duckrowing.com/2010/03/11/using-core-data-on-multiple-threads/

本文解释了如何多线程保持持久性。