2012-07-14 15 views
7

CoreData操作をディスパッチするのにNSOperationQueueを使用します。ただし、操作キューの動作が常に同じではない(スレッドプールを使用するiOS 4.0/OS 10.6ではlibdispatchを使用してディスパッチ)、キューでは常に同じスレッドを使用するとは限りません(NSManagedObjectContextと同じ)。NSOperationQueue指定されたスレッド

NSOperationQueueを強制的に1つのスレッドで実行できますか? それのために私自身の単純なキューイングの仕組みを作らなければなりませんか?

+0

あなたは知っている必要はありませんあなたの操作が実行されているスレッド。コンテキスト( ' - [context lock]')をロックして、ロックを解除するだけで済みます。ロックされたブロックからCore Dataプロパティにアクセスしないように注意してください。コンテキスト同期の必要を避けるために、最大同時操作を1に設定することを忘れないでください。 – cdelacroix

答えて

3

シリアルNSOperationQueueを1つのスレッドで強制実行できますか? それのために私自身の単純なキューイングの仕組みを作らなければなりませんか?

これらのいずれかを行う必要はありません。コアデータが実際に必要とするのは、管理対象オブジェクトコンテキストに変更を加える2つのコードを同時に持たないことです。です。これについても、ノートはConcurrency with Core Dataの一番最初にあります:

注:あなたは同時実行のためのスレッド、シリアル操作キュー、またはディスパッチキューを使用することができます。 簡潔にするために、この記事ではこれらを参照するために「スレッド」を使用しています。

実際には、指定されたコンテキストで操作をシリアル化する必要があります。 1つのスレッドを使用すると自然に発生しますが、NSOperationQueueはmaxConcurrentOperationCountを1に設定するとその操作もシリアル化します。したがって、すべての操作が同じスレッドで行われることを心配する必要はありません。

+4

警告:この回答は「間違っています! Coredataにはスレッドごとに1つのコンテキストが必要です(実際のもの!) –

+0

スレッドごとにMOCが必要だと思っていましたか? – ruipacheco

+0

@Dominick、あなたの主張のための権威のある参照を提供してください。私の答えの情報はApplesの文書からまっすぐに来ています。同じアイデアが何度かWWDCで繰り返されています。 – Caleb

-1

Appleはそれが別のスレッドのコンテキストにアクセスするにはもう安全であることイマイチ...本当のスレッドへの管理対象オブジェクトをバインドすることを決めた - 任意のオブジェクトずにコンテキストが安全かもしれないが、そのオブジェクトがありません

+0

もう一度参考にしてください。ここでのあなたのアドバイスは、Core Dataのドキュメントと矛盾しています.iOS 6 SDKのリリースノートでは、あなたの答えをサポートするものは何も見つかりません。あなたの情報はどこにありますか? – Caleb

+0

上記のあなたの答えのドキュメントを参照してください;)とGoogleを参照してください..例:http://stackoverflow.com/questions/67154/is-it-safe-to-manipulate-objects-that-i-created-outside-my-スレッドのif-i-dont-exp –

+0

一息..なぜ落選 - 少なくともそれを説明するために数秒を過ごしてください –

関連する問題