В документации MagicalRecord на github указано:
MagicalRecord предоставляет очередь фонового сохранения, так что сохранение всех данных выполняется вне основного потока в фоновом режиме. Это означает, что может быть необходимо использовать MR_saveNestedContexts, а не типичный метод MR_save, чтобы сохранить ваши изменения на всем пути к вашему постоянному хранилищу.
глядя на источник, я не могу понять разницу между этими двумя методами без команды dispatch_async
. Я вижу, что они оба сохраняют все вложенные контексты до корня, поэтому сохраняются в хранилище. Но почему и в какой ситуации я бы использовал один вместо другого?
Кроме того, поскольку я просто сохраняю вложенный контекст на один уровень выше (без сохранения для сохранения), я предполагаю, что все равно буду использовать метод - (BOOL)save:(NSError **)error
NSManagedObjectContext?
Ниже приведен исходный код двух методов.
- (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();
});
}
}
}];
}