1

Core Data がスレッド セーフでないことは概ね理解していますが、特定の状況について質問があります。メイン スレッドのコンテキストでオブジェクトを作成するとしますが、重い計算を実行したいとします。そのため、オブジェクトを別のスレッドに送信します。これはすでに悪いように聞こえますが、何らかの方法でそのオブジェクトをコピーする必要がありますか? 他のスレッドのコンテキストでオブジェクトを保存すると、そのコンテキストから有効なオブジェクトを取得できないようです (最初にストアに保存する必要がありますか? これは、ハード ディスクの悪用のようです)。現在マジカルレコードを使っていて、流れはこんな感じです。

mSaveData = [XXX MR_createEntity];
//Set various properties

//In another method
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    mSaveData.questionId = xxx;
    //Set more properties

    [[mSaveData managedObjectContext] MR_saveToPersistentStoreAndWait];
}

最初は使うべきだと思ったのです[mSaveData MR_inThreadContext]が、このメソッドは戻りますnil(オブジェクトがまだ保存されていないためでしょうか?)。私の現在のアプローチは、スレッド間でコンテキストを共有しているため (保存操作のためだけに)、少し不快です。好ましい別のアプローチはありますか?プロパティを設定して保存するには、単にメイン スレッドにディスパッチする必要がありますか?

4

1 に答える 1

2

行ってドキュメントを読んでください。スレッド間でコンテキストまたは管理対象オブジェクトを共有することはできません。

オブジェクト ID を別のスレッドに渡し、関連するオブジェクトをそのスレッドのコンテキストから取得できます。

  1. 最初のスレッドでコンテキストを保存します。
  2. contextDidSave 通知を使用して、変更を 2 番目のスレッドのコンテキストにマージします。
  3. その後、2 番目のスレッドで最新のオブジェクトを取得できます。
于 2013-07-26T01:25:24.730 に答える