嵌套PerformBlock的核心数据

时间:2014-02-08 07:06:56

标签: ios core-data

我读过一些文章,但仍然没有得出结论。假设我有一个嵌套的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执行提取时它表现良好,但我感到困惑的是 mainContext如何合并子上下文更改,因为我觉得我在这里做错了。

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

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

1 个答案:

答案 0 :(得分:3)

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

  

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

因此,如果您保存子上下文,那些更改将被推送到父级 - 但除非保存根上下文,否则不会将其写入磁盘,这可以按照不同的计划进行。

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