Core data NSManagedObject的NSMergeConflict

Core data NSManagedObject的NSMergeConflict,core-data,nsmanagedobject,Core Data,Nsmanagedobject,我异步执行多个请求,每个响应返回一个xml。我需要提取xml(我使用TBXML对其进行解析)并将其保存在核心数据中。这不能在主线程上完成,因为UI将变得太慢。 我将对每个xml响应执行以下操作: dispatch_queue_t request_queue = dispatch_queue_create("com.queue.name", NULL); dispatch_async(request_queue, ^{ AppDelegate *appDelegate = [[UIAp

我异步执行多个请求,每个响应返回一个xml。我需要提取xml(我使用TBXML对其进行解析)并将其保存在核心数据中。这不能在主线程上完成,因为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并将数据插入核心数据。 执行此操作时,我会遇到很多合并冲突,如下所示。有什么想法或者线索来调试这个问题吗?我没有改变核心数据模型

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

合并冲突封装了试图在托管对象上下文中保存更改时发生的冲突

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

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

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


请参见此处。

这可能对您有用:


本文解释了如何使用多线程实现持久性

您能简要描述一下traverseElement的功能吗?需要citation@LuongHuyDuc很好的一点——这是一段时间以前的事了。我修好了。不过,没必要否决投票。