【问题标题】:Ways to merge managed object contexts合并托管对象上下文的方法
【发布时间】:2013-07-23 06:01:01
【问题描述】:

我在 Core Data 中使用并发。像this 这样的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];
                }
            }
        }
    }
}

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我看到了这个文档,但我不明白我需要将哪个上下文 mergePolicy 设置为 NSMergeByPropertyObjectTrumpMergePolicyType。如果发生错误怎么办?当我设置了 mergePolicy 时,为什么会出现任何错误?
    • 您设置了哪些政策?如何?你能再贴一些代码吗?并且必须在托管对象上下文中设置合并策略。然后它将决定如何将此上下文数据与持久存储数据合并
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    相关资源
    最近更新 更多