1

Apple の docによると、次のようになっています。

変更をコンテキストに保存すると、その変更は「1 つ上のストア」​​にのみコミットされます。子コンテキストを保存すると、変更はその親にプッシュされます。ルート コンテキストが保存されるまで、変更は永続ストアに保存されません。(ルート管理対象オブジェクト コンテキストは、親コンテキストが nil のコンテキストです。) さらに、親は、保存する前に子から変更をプルしません。最終的に変更をコミットする場合は、子コンテキストを保存する必要があります。

私のデータモデルは、大まかに次のNSManagedObject階層で構成されています。

Category <---->> Feed <---->> Post

私のアプリケーションである RSS リーダーは、次のものを使用します。

  • Concurrency タイプNSManagedObjectContextの「ルート」 。NSPrivateQueueConcurrencyTypeこの MOC を使用して、変更を に永続化しNSPersistentStoreCoordinatorます。

  • Concurrency タイプNSManagedObjectContextの「メイン」 。NSMainQueueConcurrencyTypeこの MOC を使用して GUI にフィードします。

  • Concurrency タイプNSManagedObjectContextの「ローカル」 。NSPrivateQueueConcurrencyType新しい Posts オブジェクトのバッチを作成するときに、この MOC を使用します。

だから、私の質問は次のとおりです。

  1. を保存するlocalMOCと、自動的に に反映されますmainMOCか? または、 から観察NSManagedObjectContextDidSaveNotificationし、localMOC手動で両方の MOC を とマージする必要がありmergeChangesFromContextDidSaveNotificationますか?
  2. 昨日まで、バッチ インポートは に送信される外部DBOperation <NSOperation>コンテキストで行われていましたNSOperationQueueが、同期はどのように行われるのでしょうか? eachの親として使用するにはmainMOC、 をパラメーターとして渡す必要がありますか?DBOperationlocalMOC
  3. バッチルーチンを元に戻しましたMainViewControllerが、それが良いアイデアだったかどうかはわかりません。以前のように固執する必要がありますかNSOperationQueue、それとも現在の[localMOC performBlock:^{ ... }];構造はまともなバックグラウンド処理を提供しますか?

よろしくお願いします。

4

1 に答える 1

0

独自の保存ルーチンを実装することで、最終的に問題を解決しました。

[_localMOC performBlockAndWait:^{
    NSError *errLoc=nil;

    if (![self.mainMOC obtainPermanentIDsForObjects:@[[[_mainMOC insertedObjects]     arrayByAddingObjectsFromArray:[_mainMOC updatedObjects]]] error:&errLoc]) {
    NSLog(@" ... ");
    }

    if (![_localMOC save:&errLoc]) {
      NSLog(@" ... ");
    }
    [_mainMOC performBlockAndWait:^{
        NSError *errMain=nil;
        if (![_mainMOC save:&errMain]) {
            NSLog(@" ... ");
        }
    }]
}];

_mainMOCは から監視されてAppDelegateおり、その変更は_saveMOC親によってディスクに非同期的に永続化されることに注意してください。

于 2013-11-19T07:43:23.853 に答える