1

NSManagedObjectsバックグラウンド スレッドからオブジェクトを取得する最善の方法は、 を使用し[context objectWithId:id];て、実際のオブジェクトの代わりにオブジェクト ID を渡すことです。

NSManagedObject私の中にグローバルがあるとしましょうAppDelegate(最高のデザインパターンではありませんが、例として)NSManagedObject *myObject;

objectIdバックグラウンド スレッドからこのオブジェクトにアクセスしても安全ですか? このような:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        objectId = appDelegate.myObject.objectId;
        //is this thread safe?
}
4

2 に答える 2

4

objectID呼び出しが安全であるという保証がないため、これは安全ではありませんmyObject。ブロックの外部 (メイン スレッドなど) で objectID にアクセスし、ブロック内で使用する必要があります。何かのようなもの:

NSManagedObjectID *objectID = appDelegate.myObject.objectId;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    // use objectID here.
}
于 2012-06-25T00:55:48.820 に答える
1

(歴史的に)使用するスレッドごとに個別のコンテキストが必要です。dispatch_async は特定のスレッドで実行されることが保証されていないため、ブロック内にコンテキストを作成する必要があります。または、iOS 5.0 以降では、NSManagedContext に新しい同時実行モードが付属しています。コンテキストは、ブロックを渡すための独自のプライベート シリアル キューを作成します。iOS 4.x をサポートする必要がある場合は、この動作をモデル化できます。シリアル キューを作成し、そのキューからのみコンテキストにアクセスします。

競合状態が発生する可能性があるため、2 つの異なるスレッドからのコンテキストでクエリまたは変更を引き起こすようなことは何もしないでください。

于 2012-06-25T01:08:39.130 に答える