0

在 MagicalRecord github 文档中它指出:

MagicalRecord 提供了一个后台保存队列,以便在后台从主线程执行保存所有数据。这意味着可能需要使用 MR_saveNestedContexts 而不是典型的 MR_save 方法,以便将更改一直保存到持久存储。

查看源代码,我无法弄清楚这两种方法减去dispatch_async命令之间的区别。我看到它们都将所有嵌套上下文保存到根目录,因此保留到商店。但是为什么以及在什么情况下我会使用其中一种呢?

另外,至于只是将嵌套上下文保存到上一级(不持久存储),我假设我仍然会使用 NSManagedObjectContext 的- (BOOL)save:(NSError **)error方法?

下面是这两种方法的源代码。

- (void) MR_save {
    [self MR_saveErrorHandler:nil];
}

- (void) MR_saveErrorHandler:(void (^)(NSError *))errorCallback {
    [self performBlockAndWait:^{
        [self MR_saveWithErrorCallback:errorCallback];

        if (self.parentContext) {
            [[self parentContext] performBlockAndWait:^{
                [[self parentContext] MR_saveErrorHandler:errorCallback];
            }];
        }
    }];
}

- (void) MR_saveNestedContexts {
    [self MR_saveNestedContextsErrorHandler:nil];
}

- (void) MR_saveNestedContextsErrorHandler:(void (^)(NSError *))errorCallback {
    [self MR_saveNestedContextsErrorHandler:nil completion:nil];
}

- (void) MR_saveNestedContextsErrorHandler:(void (^)(NSError *))errorCallback completion:(void (^)(void))completion {
    [self performBlock:^{
        [self MR_saveWithErrorCallback:errorCallback];

        if (self.parentContext) {
            [[self parentContext] performBlock:^{
                [[self parentContext] MR_saveNestedContextsErrorHandler:errorCallback completion:completion];
            }];
        } else {
            if (completion) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    completion();
                });
            }
        }
    }];
}
4

2 回答 2

0

从 iOS5 和 Lion 开始,CoreData 中新的父/子功能,有时需要“强制”保存到磁盘。也就是说,例如,当您有 3 个上下文时,例如:

root <- child1 <- child2

如果您保存在 child2 中,这些更改只会向上一级通知给 child1。Root不会拥有它们。为此,您必须再调用一次 save。您可以拥有任意长的这些上下文列表这一事实意味着您将不知道您的保存是否会到达根上下文,它也负责对存储(磁盘)进行持久更改。saveNestedContexts 使用递归来遍历这棵树,并确保您的保存实际上进入磁盘,当您打算这样做时。

于 2012-11-09T00:33:20.467 回答
0

'MR_save' 和 'MR_saveNestedContexts' 之间的相似性在 2.0.8 版本中发生了变化(我使用的是 2.0.7)。

这是 github 上的提交:https ://github.com/magicalpanda/MagicalRecord/commit/f7c4350e9daf7d90eec83ba5eafeccfa7af34312

和讨论:https ://github.com/magicalpanda/MagicalRecord/issues/305

总而言之,在 2.0.8 版本中,“MR_save”现在只保存当前上下文,而“MR_saveNestedContexts”递归地保存到最顶层的上下文。

于 2012-11-12T13:10:44.720 回答