合并托管对象上下文的方法

时间:2013-07-23 06:01:01

标签: ios objective-c core-data concurrency nsmanagedobjectcontext

我在Core Data中使用并发。像this这样的Apple文档经常告诉我,上下文的同步取决于我的应用程序的语义。我找不到具体的样本如何合并UIManagedObjectContext。 因此,在我的应用中,UIManagedObject可能在不同的上下文中具有不同的属性值。我需要通过替换对象或更新其属性来合并上下文。 这是我的代码:

- (void)__saveToMainContext
{
    if ([_context_ hasChanges])
    {
        NSError *error = nil;
        if (![_context_ save:&error])
        {
            if (error.code == NSManagedObjectMergeError)
            {
                for (NSMergeConflict* conflict in [[error userInfo] objectForKey:@"conflictList"])
                {
                    [_context_ refreshObject:[conflict sourceObject] mergeChanges:YES];
                }
            }
        }
    }
}

但是这个方法会创建重复的对象。

1 个答案:

答案 0 :(得分:1)

理论上,您应该选择您喜欢的合并策略,并将其设置在 NSManagedObjectContexts like the doc says中。

您将能够决定是否保留本地更改,存储一次等等:

enum {
   NSErrorMergePolicyType                      = 0x00,
   NSMergeByPropertyStoreTrumpMergePolicyType  = 0x01,
   NSMergeByPropertyObjectTrumpMergePolicyType = 0x02,
   NSOverwriteMergePolicyType                  = 0x03,
   NSRollbackMergePolicyType                   = 0x04
};

但我猜你已经知道了这件事。一旦我写了一个类别来更轻松地处理这些情况,你就可以找到implementation code here。我自己在网络空间的某处发现了它的一部分,但我现在找不到它,因此我不能引用另一位作者。

但是我的句子总是:避免手动处理。屁股真的很痛苦。我发现使用MagicalRecord进行CoreData管理非常方便,它就像魅力一样。