2013-05-20 6 views
6

NSManagedObjectContextにはperformBlock:およびperformBlockAndWait:メソッドが追加されているため、並行処理が容易になりました。私はそれらを使ってきました - 潜在的にかなりまともではありません - そして、私は本当に尋ねたことのない質問があることに気付きました。コンテキストのperformBlockの外でNSManagedObjectを使用できますか?

performBlockメソッドの1つの中にNSManagedObjectサブクラスを作成すると、その 'home'スレッドは親コンテキストのスレッドになります。NSPrivateQueueConcurrencyTypeの場合はおそらく別のアクセス権がありません。

私は管理オブジェクト内のデータにアクセスするためにperformBlockコールを行う必要がありますか?またはゲッターを使用する場合に私を守るためにバックグラウンドマジックが行われていますか? (またはセッター、それは悪い考えのようです...)

答えて

13

NSManagedObjectは、そのmanagedObjectContextのスレッド/キューの外で使用することは想定されていません(ときどき動作し、何回かクラッシュする==>しないでください)それ)。

CoreDataは、オブジェクトへの安全な読み取りアクセスを保証しません。あなたはそのobjectIDまたはmanagedObjectContextプロパティにアクセスしない限り、[context performBlock:...]または[context performBlockAndWait:...]のいずれかを使用して、常に、「プライベートキュー」文脈が所有するオブジェクトにアクセスするには

+0

ありがとう、私が思っていたものはかなり必要でした...私は間違っていたと思っていました。 WWDCのビデオを見直す必要があります。なぜなら、そのことを覚えていないからです。もう一度、WWDCのビデオがたくさんあると思います。 – RonLugge

+1

私はちょうどAppleエンジニアが明示的に 'NSManagedObject'の読み込みがスレッドセーフではないことを明示したいとします。 –

9

performBlock:またはperformBlockAndWait:を使用する必要がありますが、1つの例外があります。 NSMainQueueConcurrencyTypeを使用している場合は、メインキューで管理対象オブジェクトを使用しているため、ブロックなしで直接アクセスできます。これは、管理対象オブジェクトからUIを更新する必要がある場合、またはその逆の場合に便利です。

+1

もう1つの例外はメインキューに似た' NSConfinementConcurrencyType'です、特定のスレッド(管理されたコンテキストの "古い"バージョン)に限定してください –

+0

NSPrivateQueueとNSMainQueueの型にのみ関係するので、私は自分の質問をよりよく言いたいはずでしたね。プライベートキューのバージョンこの素晴らしい例外のおかげで。 – RonLugge

関連する問題