从第二个线程保存时,Core Data合并冲突

时间:2011-12-21 02:36:30

标签: multithreading core-data merge

我的核心数据模型中有两个实体。 Entity1和Entity2。 Entity1具有链接到Entity2的一对一关系。当我在单个线程上访问/保存实体时,一切正常。

现在我开始使用后台线程进行一些处理。我将entity1的NSManagedObjectID传递给我的第二个线程,并将NSPersistentStoreCoordinator传递给我的第二个线程。第二个线程创建一个新的managedObjectContext,使用managedObjectID加载entity1,然后使用来自entity1的Relationship加载entity2。这一切似乎都有效,我可以访问entity2。

但是,如果我想更改entity2,当我保存更改时,我会收到合并冲突错误“操作无法完成。(Cocoa error 133020.)”。查看错误消息,“之前”和“之后”之间唯一不同的是实体2的引用,它指向实体1。在这种情况下,没有其他不同(即使我没有更改其他属性,我正在保存)。这对我来说很有意义,因为我的thread2上的entity1是一个与我的thread1上的entity1不同的对象...所以对它的引用必须是不同的。

那么如何从我的thread2中保存数据呢?看来这个引用在我的两个线程之间总是不同......

任何建议都会有所帮助!提前致谢。

2 个答案:

答案 0 :(得分:5)

您可以通过在托管对象上下文中设置NSMerge策略来编辑发生合并冲突时发生的情况。请参阅文档中的更多详细信息:

https://developer.apple.com/library/ios/documentation/CoreData/Reference/NSMergePolicy_Class/Reference/Reference.html#jumpTo_8

代码看起来像这样:

- (void)saveContext {
    /* save changes to context */
    NSManagedObjectContext *context = [self managedObjectContext];
    NSMergePolicy *mergePolicy = [[NSMergePolicy alloc] initWithMergeType:NSMergeByPropertyStoreTrumpMergePolicyType];
    [context setMergePolicy:mergePolicy];

    NSError *error = nil;
    if ([context save:&error]) {
    } else {
        NSLog(@"The save wasn't successful: %@", [error userInfo]);
    }
}

答案 1 :(得分:1)

在挖掘了一些之后,我意识到我没有正确跟踪线程之间的变化(如下所述:https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreData/Articles/cdConcurrency.html#//apple_ref/doc/uid/TP40003385-SW1)。我将更详细地实现这一点,看看是否能解决问题。