2012-02-21 15 views
2

NSPrivateQueueConcurrencyTypeNSManagedObjectContextを使用しています。次のような状況でデッドロックが発生します。2つのスレッドでNSPrivateQueueConcurrencyType管理対象オブジェクトコンテキストを使用した場合のデッドロック

バックグラウンドスレッドでは、performBlock:の呼び出しが行われます。そのブロックにはexecuteFetchRequest:error:コールが含まれています。

ブロックが実行されている間、メインスレッドはperformBlockAndWait:を呼び出します。メインスレッドは、バックグラウンドスレッドのブロックが終了するのを待ちます。それは正常です。

バックグラウンドのスレッドブロックでexecuteFetchRequest:error:コールが行われると、デッドロックが発生します。

私はexecuteFetchRequest:error:performBlockAndWait:のメインスレッドが終了するのを待っていると思います。

これはバグですか?または私は何かを理解していないのですか?私にとっては、このコードはすべてNSPrivateQueueConcurrencyType MOCで有効と思われます。

+0

これはあまり起こりませんが、それが起こると、まあ...アプリは死んでいます。 – gcamp

答えて

2

NSPrivateQueueConcurrencyTypeは自動的にNSManagedObjectContextをスレッドセーフにしません。複数のスレッドでコアデータを使用する必要がある場合は、スレッドごとに別々のコンテキストを使用する必要があります。

+0

プライベートキューのポイントは何ですか?ドキュメントから:「コンテキストが関連付けられているスレッドまたはキューを作成および管理する代わりに、コンテキストがキューを所有し、すべての詳細を管理します(後述のブロックベースの方法を使用する場合)。 "ブロックベースの方法を使用し、1つのコンテキストだけを使うべきだと私には思えます。 – gcamp

+0

私がNSPrivateQueueConcurrencyTypeを理解したのは、プライベートスレッド上で操作のブロックを実行できるということですが、複数のスレッドからアクセスすることによって生じる競合状態を手動で回避する必要があります。ドキュメントをもう一度読んだら、私は100%確信していません... – Aderstedt

+0

メインスレッドでperformBlockAndWait:を実行するときにNSMainQueueConcurrencyTypeを使用していることを確認しました。今のところ働きます。 – gcamp

関連する問題