0

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

2 に答える 2

0

「MR_save」と「MR_saveNestedContexts」の類似性は、バージョン 2.0.8 で変更されました (私は 2.0.7 を使用していました)。

github のコミットは次のとおりです

そして議論: https://github.com/magicalpanda/MagicalRecord/issues/305

要約すると、バージョン 2.0.8 では、'MR_save' は現在のコンテキストのみを保存し、'MR_saveNestedContexts' は最上位のコンテキストまで再帰的に保存します。

于 2012-11-12T13:10:44.720 に答える
0

iOS5 および Lion の CoreData の新しい親子機能により、ディスクへの保存を「強制」する必要がある場合があります。つまり、たとえば次のような 3 つのコンテキストがある場合です。

root <- child1 <- child2

child2 に保存すると、それらの変更は、1 レベル上の child1 にのみ通知されます。ルートにはそれらがありません。これを行うには、save をもう一度呼び出す必要があります。これらのコンテキストの任意の長いリストを持つことができるという事実は、保存がルート コンテキストに到達するかどうかがわからないことを意味します。ルート コンテキストは、ストア (ディスク) への変更の永続化も担当します。saveNestedContexts は、再帰を使用してこのツリーをトラバースし、意図したときに保存が実際にディスクに保存されるようにします。

于 2012-11-09T00:33:20.467 に答える