2009-11-12 20 views
5

NSOperationQueueを使用して2つのスレッド間でいくつかのNSManagedObjectデータを渡していますが、NSOperationQueueの同時実行レベルは最大1までです。これを正しく実行しているかどうかについていくつかの提案があります。NSOperationとCoreDataスレッディング

NSManagedObjectはスレッドセーフではないので、NSAperation派生クラスを介してThreadA(メインスレッド)からThreadBにNSManagedObjectIDを送信しています。一般的なワークフロー:

スレッドA(メインスレッド):

  • がNSPersistentStoreCoordinator
  • メインNSManagedObjectContext(1)
  • がworkerThread

  • における使用のためNSManagedObjectContext(2)を作成作成作成
  • はMyNSOperationItemを作成し、NSManagedObjectContextに沿って渡し、MyNSOperationItemをNSOperationQueueに追加します。

ThreadB(NSOperationQueueのスレッド):

  • NSOperation派生クラスが提供オブジェクトIDを使用して、永続
    ストアからデータを取得します。

マイNSOperationクラスは、次のようになります。

@interface MyNSOperationItem: NSOperation 
{ 
    // MyNSOperationItem is created in thread1 and MOC will be 
    // set on creation 
    NSManagedObjectContext *threadedMOC; 

    NSManagedObjectID  *workItemObjectID; 
} 
@end 

だから、NSManagedObjectContextへの参照を持っている私のNSOperation派生クラスのために大丈夫ですか、私は他の場所で二NSManagedObjectContextを保存する必要がありますか?これはキューなので、MyNSOperationItemの多数のインスタンスが作成され、それぞれが同じNSManagedObjectContextを指しています。

答えて

5

私は、これはあなたが必要なすべてを与えるべきだと思う:

http://developer.apple.com/mac/libra...reData/Articles/cdMultiThreading.html

あなたがバックグラウンドスレッドにフェッチオフロードする必要がある場合は、ここで私は上記参照文書から少しヒントです:

は、あなたはコアデータで使用できる最も簡単なマルチスレッド 技術の

ワンバックグラウンドスレッドでフェッチ

アプリケーション応答性を向上させるために は、 バックグラウンドスレッドでフェッチ要求を実行します。 ( バイナリおよびXMLストアからデータをすぐにオープンに メモリに読み込まれているので、あなたが 、SQLiteのストアを使用している場合は、この 技術はのみ有用であることに注意してください。)この フェッチ場合は 複雑であるか、大きなを返すことを意味しデータの量が多い場合、 はユーザーに制御を戻し、 は結果を表示します。これを行う方法の例については、 BackgroundFetchingの例を /Developer/Examples/CoreData /に掲載しています。

という2つの管理対象オブジェクトコンテキストを、単一の永続的な ストアコーディネータに関連付けて使用します。 1つの 管理オブジェクトコンテキストを背景の スレッドにフェッチし、 フェッチされたオブジェクトのオブジェクトIDを別のスレッドに渡します。 では、第二のスレッド(通常 アプリケーションのメインスレッド、あなたが その結果を表示できるように)、あなたは 二コンテキストを使用するには、それらのオブジェクトIDを持つオブジェクト でフォルト(あなたが を使用objectWithID: オブジェクトをインスタンス化します)。

+0

このリンクは、「/ Developer/Examples/CoreData」の「BackgroundFetching」と呼ばれるサンプルアプリケーションを参照していました。そのサンプルを見つけるためのアイデアはありますか? –

+0

あなたが正しい。そして、devサイトでは利用できないようです。取引が何であるかわからないあなたは古い情報を指摘するAppleにドキュメンテーションのバグを報告することができます。たぶん彼らは新しいパスやリンクでそれを更新するでしょう。それからもう一度、彼らはそれを更新し、パス/リンクを完全に削除するでしょう。申し訳ありません。 –