2009-09-21 17 views
14

Concurrency with Core DataのAppleのコアデータのドキュメントでは、共有NSPersistentStoreCoordinatorを使用して、スレッドごとに別々のNSManagedObjectContextを使用するようにスレッドセーフに関する推奨方法を示しています。コアデータ(NSOperationQueueおよびNSManagedObjectContext)のマルチスレッド使用

NSOperationQueueで複数のNSOperationsが順番に実行されている場合、各タスクでコンテキストを作成する際に大きなオーバーヘッドが発生しますか?

最大同時操作数が1のNSOperationQueueでは、多くの操作で同じスレッドが使用されます。スレッド辞書を使用してスレッドごとに1つのNSManagedObjectContextを作成できますか?私がそうするなら、後で私の文脈を浄化するのに問題はありますか?

このインスタンスでコアデータを使用する正しい方法は何ですか?

答えて

19

、この場合にコアデータを使用するための正しい方法は、あなたが(使用後に、使用前-[NSManagedObjectContext lock]-[NSManagedObjectContext unlock]経由)ロック単一のコンテキストを持つように操作またはごとに別々のNSManagedObjectContextを作成することです。ロックされたアプローチは、操作がシリアルであり、コンテキストを使用する他のスレッドが存在しない場合に意味をなされることがあります。

どのアプローチを使用するかは、データなしでは実行できない経験的な質問です。一般的なルールを持つ変数が多すぎます。パフォーマンステストの厳しい数値は、情報に基づいた決定を下す唯一の方法です。

+1

FYI - 'lock'と' unlock'はiOS8とOSX 10.10では非推奨です。 "キュースタイルのコンテキストと-performBlockAndWaitを代わりに使用する" –

2

最大同時操作数1を使用してNSOperationQueueを使用して開始された操作では、同じスレッドですべての操作が実行されません。操作は順番に実行されますが、毎回新しいスレッドが作成されます。

スレッド辞書にオブジェクトを作成することはほとんど役に立ちません。

+2

毎回新しいスレッドになるという保証はありません。実際、Snow Leopardでは、NSOperationQueueはスレッドを明示的に再利用するGrand Central Dispatchを使用します。 –

+0

この質問はiPhoneについてのものであり、Snow Leopardに関するものではありません。もちろん**保証はありません**、これまでありますか? –

2

この質問は古いですが、実際にはGoogleの検索結果のトップに 'NSMangedObjectContext threading'が表示されていますので、新しい回答を記載します。

新しい「優先する」方法は、initWithConcurrencyType:を使用して、それがメインスレッドMOCかセカンダリスレッドmocかをMOCに伝えることです。次に、新しいperformBlock:とperformBlockAndWait:メソッドを使用すると、MOCはそのスレッドを「ネイティブ」スレッドでシリアライズします。

この問題は、アプリが生み出すさまざまなMOC間でデータをマージする方法と、プログラマーとして人生を楽しくさせる他の何千もの詳細をどうやって処理するかになります。

関連する問題