【问题标题】:Core Data with Nested PerformBlock具有嵌套 PerformBlock 的核心数据
【发布时间】:2014-03-05 18:31:34
【问题描述】:

我已经阅读了一些文章,但仍然没有得出结论。假设我有一个嵌套的NSManagedObjectContext

 BackgroundContext -> NSPrivateQueueConcurrencyType
              | 
            child
              v
 MianContext -> NSMainQueueConcurrencyType
              |
            child
              v
 TemporaryContext -> NSPrivateQueueConcurrencyType

问题 1:我是否仍要观察 NSManagedObjectContextObjectsDidChangeNotification 并合并更改,例如:

- (void)managedObjectContextDidChanged:(NSNotification *)notification{
    NSManagedObjectContext *currentContext = [notification object];
    NSManagedObjectContext *mainConetext = [self mainThreadContext];
    if (currentContext != mainConetext) {
        [mainConetext performBlock:^{  //performBlock in notification
            [mainConetext mergeChangesFromContextDidSaveNotification:notification];
        }];
    }
}

事实上我已经尝试删除这段代码,当我在mainContext 上执行提取时它表现良好,但我感到困惑的是 ma​​inContext 如何合并子上下文的变化,因为我感觉我在这里做错了什么。

问题 2:我应该使用嵌套的performBlock 来合并更改吗??

[temporaryContext performBlock:^(
    //do some thing
    [mainContext performBlock:^(
         // merge changes
    )];
)];

【问题讨论】:

    标签: ios core-data


    【解决方案1】:

    保存子上下文后,这些更改会自动推送到父上下文。正如它在docs 中所说,您可以将上下文堆栈视为在根部具有持久存储协调器。已保存的更改会向上推送一级:

    当您在上下文中保存更改时,更改只会“一次存储”提交。如果您保存子上下文,则会将更改推送到其父上下文。在保存根上下文之前,更改不会保存到持久存储中。 (根托管对象上下文是其父上下文为 nil 的上下文。)此外,父级在保存之前不会从子级拉取更改。如果您想最终提交更改,则必须保存子上下文。

    因此,如果您保存子上下文,这些更改将推送到父上下文 - 但不会写入磁盘,除非根上下文已保存,出于您的目的,根上下文可以按不同的时间表进行。

    在这种结构下,不需要合并更改和观察保存。这是它的众多优点之一。

    【讨论】:

    • 所以不用观察NSManagedObjectContextObjectsDidChangeNotification吧?
    • 正确。抱歉,我实际上并没有在答案中说清楚,是吗?
    • 谢谢,我正在尝试了解如何处理 coreData 并发,但我对嵌套的上下文结构感到非常困惑。
    • 你可能已经看过了,但这是一篇好文章:cocoanetics.com/2012/07/multi-context-coredata
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多