1

我在 Core Data 中使用并发。像这样的Apple 文档经常告诉我,上下文的同步取决于我的应用程序的语义。而且我找不到如何合并UIManagedObjectContexts 的具体示例。所以在我的应用程序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];
                }
            }
        }
    }
}

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

4

1 回答 1

1

理论上,您应该只选择您喜欢的合并策略并将其设置在NSManagedObjectContexts中,就像文档说的那样

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

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

但我猜你已经知道这些事情了。一旦我编写了一个类别来更轻松地处理这些情况,您可以在此处找到实现代码。我自己在网络空间的某个地方找到了它的一部分,但我现在找不到它,因此我无法引用其他作者。

我的选择始终是:避免手动处理。真是让人头疼。我发现使用MagicalRecord进行 CoreData 管理真的很舒服,它就像一个魅力。

于 2013-07-23T07:38:58.097 回答