2012-03-19 6 views
1

NSManagedObjectsはスレッドセーフではなくmanagedObjectIDsがあり、スレッドごとに個別のmanagedObjectContextが必要であることはわかっています。しかし、最近、バックグラウンドでいくつかのコアデータの変更を行っていたときに問題が発生しました(これに対して別々のrunloopスレッドがありました)。performSelectorOnThread:メソッドがこのrunloopスレッドで呼び出されないことがありました。これは、その理由は、私は、この実行ループのスレッドと「SomeObjectの」上managedObjectContextを別のスレッドから保存しようとするとどうなりますか?

[someObject.managedObjectContext save:&error] 

メインスレッド上で作成されたをしていたということであったことが判明しました。しかし、それはしばらくの間、runloopスレッドを「ハングアップ」するだけです。つまり、別のスレッドにコンテキストを保存しようとすると、本当に何が起こるのでしょうか。私はもっ​​と深い理解を探しています、ありがとう。 https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/NSManagedObjectContext.htmlから

+2

あなたは瞬時に止まることを知っているようにすべての人生を想像して、体のあらゆる分子が光速で爆発するようにしましょう。 – rickster

答えて

1

コアデータが 管理対象オブジェクトと管理オブジェクトコンテキストを保護するためのスレッド(または直列化されたキュー)閉じ込めを使用しています(「 コアデータとの同時実行」を参照してください)。その結果、コンテキストでは、 のデフォルトの所有者が、割り当てられたスレッドまたはキューであるとみなされます。これは、 で、initメソッドを呼び出すスレッドによって決定されます。しないでください、 したがって、1つのスレッドでコンテキストを初期化し、別のスレッド に渡します。代わりに、永続的な ストアコーディネータへの参照を渡して、受信スレッド/キューに新しい コンテキストを作成させる必要があります。

0

クラッシュします。デバッグ中にクラッシュが発生することはありませんが、これを行うべきではありません。オブジェクトコンテキストとその中の管理対象オブジェクトは、作成されたスレッド上でのみ使用する必要があります。 Appleのドキュメントにはこのことが非常に明確で、長時間実行される操作(スローフェッチまたは非同期保存)が発生する状況を処理する方法の多くの例が示されています。詳細については、コアデータを使用したスレッディングに関するドキュメントを参照してください。

関連する問題