关于MagicalRecord,方法MR_saveNestedContexts和MR_save之间有什么区别
在MagicalRecord github文档中说:
MagicalRecord提供了一个后台保存队列,以便在后台执行保存所有数据的主线程。 这意味着可能需要使用MR_saveNestedContext而不是典型的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(); }); } } }]; }
有了iOS5和Lion的CoreData中新增的Parent / Childfunction,有时候需要强制保存到磁盘。 也就是说,当你有,例如,3个上下文,如:
root <- child1 <- child2
如果保存在child2中,那么这些更改只会通过一个级别通知给child1。 根不会有他们。 为了做到这一点,你必须再打一次保存。 事实上,你可以有一个任意长的这些上下文的列表意味着你不知道你的保存是否到达根上下文,这也是负责持久化存储(磁盘)的变化。 saveNestedContexts使用recursion来遍历这个树,并确保当你打算这样做的时候,你的保存实际上到磁盘。
“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”recursion地保存到最上面的上下文中。