MagicalRecord github docs には、次のように記載されています。
MagicalRecord はバックグラウンド保存キューを提供するため、すべてのデータの保存はバックグラウンドでメイン スレッドから実行されます。これは、永続ストアまで変更を永続化するために、通常の MR_save メソッドではなく MR_saveNestedContexts を使用する必要がある場合があることを意味します。
dispatch_async
ソースを見ると、これら 2 つのメソッドからコマンドを除いた違いがわかりません。どちらもネストされたすべてのコンテキストをルートまで保存しているため、ストアに永続化されていることがわかります。しかし、なぜ、どのような状況でどちらを使用するのでしょうか?
また、ネストされたコンテキストを 1 レベル上に保存するだけで (保存を永続化せずに)、NSManagedObjectContext の- (BOOL)save:(NSError **)error
メソッドを引き続き使用すると仮定していますか?
以下は、2 つのメソッドのソース コードです。
- (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();
});
}
}
}];
}