在 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();
});
}
}
}];
}