1

最近 Core Data Programming Guide を読みましたが、Apple はそうするように勧めています

バックグラウンド スレッドで 1 つの管理対象オブジェクト コンテキストをフェッチし、フェッチしたオブジェクトのオブジェクト ID を別のスレッドに渡します。2 番目のスレッド (通常はアプリケーションのメイン スレッドで、結果を表示できるようにするため) では、2 番目のコンテキストを使用して、それらのオブジェクト ID を持つオブジェクトをフォールトします (objectWithID: を使用してオブジェクトをインスタンス化します)。(この手法は、SQLite ストアを使用している場合にのみ役立ちます。 > バイナリおよび XML ストアからのデータは、開くとすぐにメモリに読み込まれるためです。)

私の理解では、バックグラウンド コンテキストでのフェッチは管理対象オブジェクトをメイン スレッド コンテキストに登録しないため、objectWithID から返された管理対象オブジェクトはおそらくエラーです。メイン スレッドで使用すると、SQLite ストアへの新しいラウンドのトリップがトリガーされます。そのため、UI がブロックされている可能性があります。

何か見逃しましたか?メインスレッドの I/O オーバーヘッドを回避する方法はありますか?

4

1 に答える 1

4

バックグラウンドでフェッチを実行し、次に objectID を使用してメイン スレッドでフェッチを実行する場合、あまり耳にすることはありません。まず、レコードは CoreData キャッシュ上にあるため、メイン スレッドでの同じフェッチが高速になります。次に、objectID を使用したフェッチは、平均的なフェッチ リクエストを使用したフェッチよりもはるかに高速です。通常行うことは、バックグラウンド フェッチ リクエストを作成し、探しているオブジェクトの objectID を見つけて、それらの objectID をメイン スレッドに移動することです。もちろん、バックグラウンド スレッドでは、メイン スレッドとは異なる NSManagedObjectContext インスタンスを使用する必要があります。

WWDC 2010 のビデオ「Mastering Core Data」を確認することをお勧めします。バックグラウンド/メイン スレッドでのキャッシュとフェッチのパフォーマンスを説明しながら、コア データとマルチスレッドについて説明します。

于 2012-08-30T12:57:53.630 に答える