私のアプリでは、NSManagedObjectContext のインスタンスを作成します。2 つのスレッドがこのインスタンスにアクセスでき、すべてのスレッドが変更をコミットする必要があります。save メソッドが 2 つのスレッドで同時に呼び出された場合はどうなりますか? コンテキスト内のすべての NSManagedObject インスタンスのプロパティはどうなりますか?
2 に答える
あなたはそのようにすることを想定していません。スレッドごとに2つの別々のNSManagedObjectContextを作成します。CoreDataはスレッドセーフではありません。CoreDataでマルチスレッドを実行する前に、このドキュメントをお読みください。
NSPersistentStoreCoordinator は、複数のスレッドまたはキューで NSManagedObjectContext の適切なロックを処理しますが、NSManagedObjectContext 自体は、それが作成されたスレッドである 1 つのスレッドでのみ使用する必要があります (よくある間違いは、メイン スレッドで MOC を作成し、それを別のスレッドに渡すことです -こんなことしないで)。
Tony が示したように、スレッドごとに MOC を持ち、永続的なストア コーディネーターを共有するか、iOS 5 で導入された Core Data の新しい同時実行モードを使用して、子コンテキストを作成したり、新しい performBlock と performBlockAndWait を使用したりしたいコンテキストが正しいスレッドで実行されることを保証するメソッド。
あなたの質問に対する直接的な答えは、「誰が知っているか」です。動作は未定義になり、ほぼ確実にランダムなクラッシュやデッドロックに遭遇します。