【问题标题】:NSMergeConflict for NSManagedObjectNSManagedObject 的 NSMergeConflict
【发布时间】:2011-10-24 14:33:11
【问题描述】:

我异步执行多个请求,每个响应返回一个 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 =  ...

【问题讨论】:

  • 您能否简要描述一下您的 traverseElement 的作用?

标签: core-data nsmanagedobject


【解决方案1】:

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

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

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

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

在此处查看documentation

【讨论】:

【解决方案2】:

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

这篇文章解释了应该如何使用多线程来实现持久性。

【讨论】:

    猜你喜欢
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多