1

UIManagedDocument のドキュメントで簡単に言及されています。

非同期データ書き込みをサポートするために、Core Data は実際にはネストされた管理対象オブジェクト コンテキストのペアを使用します。

それは UIManagedDocument または Core Data に固有のものですか?

同文書には、次のようにも記載されています。

必要に応じて、バックグラウンド スレッドからコンテキストにデータを直接ロードできます。

それは、次のコードで

NSManagedObjectContext *moc = self.managedObjectContext;
[moc performBlock:^() {
    Record *record = [NSEntityDescription
        insertNewObjectForEntityForName:@"Record" 
                 inManagedObjectContext:moc];
}];

最初の行を次のように置き換えるだけです

NSManagedObjectContext *moc = self.managedObjectContext.parentContext;

それを達成するには?

この親コンテキストを直接使用するのが「適切」な場所についても混乱していると思います。つまり、すでに performBlock がタスクをバックグラウンド キューにアンロードするために使用されることを意図しているように聞こえます。親コンテキストをいじる必要があるのはなぜですか?

誰かが私のためにそれをすべて明確にしてくれれば幸いです。

4

1 に答える 1

6

これは の実装の詳細ですがUIManagedDocument、これは Core Data アプリケーションの一般的な設計パターンです。のmanagedObjectContextUIManagedDocument同時実行タイプが のコンテキストでNSMainQueueConcurrencyTypeあり、parentContextは同時実行タイプが のコンテキストですNSPrivateQueueConcurrencyType

同時実行タイプの詳細については、こちらを参照してください。つまり、親コンテキストは操作にバックグラウンド キューを使用し、子コンテキストはメイン キューを使用します。

通常、バックグラウンド キューで非ブロッキング方式で何かを実行する場合は、親コンテキストを直接操作する必要があります。たとえば、長くて難しいフェッチ リクエストを実行したい場合は、親コンテキストで直接実行できます。返されたオブジェクトはコンテキスト間で交換できないため、返されたオブジェクトをあるコンテキストから別のコンテキストに再フェッチする必要があることに注意してください (ただし、再フェッチは で簡単に実行できます[NSPredicate predicateWithFormat:@"SELF IN %@", fetchedObjectsFromAnotherContext])。

結論として、それはあなたが手術で何をするかによって異なります. performBlock:メイン キュー コンテキストは、すべてがメイン キュー (メイン スレッド) で実行されるため、を使用する必要がないため、物事が大幅に簡素化されます。オブジェクトを挿入するだけの場合、プライベート キューに移動するメリットは無視できるか、OS によるコンテキスト スイッチが原因で悪影響を与えることさえあります。ただし、このオブジェクトの挿入を実行するために重い作業を実行する必要がある場合は、それをバックグラウンド キューにオフロードして、親コンテキストで直接実行できます。

于 2013-05-04T00:34:27.470 に答える