0

私は複数のスレッドが永続ストア(SQLiteデータベース)から単一のNSManagedObjectContext(MOC)インスタンスにデータをプルしています。私はそれをかなり徹底的にテストし、操作が重複する場合(スレッド5がそうしている間にスレッド4をMOCにロードする)、すべてがスムーズに実行されます。複数のスレッドから1つの管理オブジェクトコンテキストにオブジェクトをロードする際の問題点は何ですか?

私はCore Data Programmingガイドを読みましたが、Appleがこの動作を許していないことを認識していますが、その理由は何か不思議です。ドキュメントでは、Appleは書き込みが危険であるだけでなく、フォールトが発生する可能性があるため、読み取りも同様であることを簡単に暗示しています。どのように(別のスレッドからロードするすべてのオブジェクトが互いに重複しない個別のエンティティである場合)?そして、それは単にアプリケーションがパフォーマンスヒットを意味するのではないのですか?したがって、パフォーマンスのヒットがメモリ使用量の増加よりも良いトレードオフであると判断した場合、私は1つのMOC(非推奨)メソッドを使用する傾向があります。

私はどちらの場合でも推奨された方法に戻すつもりですが、これらの規則が守られていないとどうなるかについての具体的な詳細については興味があります。前もって感謝します。

答えて

1

私は本当に知りませんが、誰もまだ答えていないので。

スレッドセーフではないため、スレッドセーフではありません。コアデータプログラマが非表示のインスタンス変数をNSManagedObjectContext numberOfObjectsLoadedに配置するとします。スレッドAでは、管理オブジェクトの関係foo.barにアクセスします。スレッドBでは、全く関係のないオブジェクトbaz.number = 14に変更を加えます。フーとバズはどちらも欠点です。彼らはロードされます。両方のスレッドは、コード

numberOfObjectsLoaded += 1 

の行を実行しようとする。しかし、スレッドAは、numberOfObjectsLoadedを読み込ん77、その後、コンテキストスイッチを取得します。スレッドBは77を読み取り、1を加算して78を割り当てます。スレッドAに戻ると、1に77が追加され、それは読み込まれ、78を取得し、numberOfObjectsLoadedに78を割り当てます。 numberOfObjectsLoadedには79が必要ですが、78があります。この矛盾は予期しないエラーにつながり、最終的にはクラッシュする可能性があります。プログラムを実行するのは1/1000倍に過ぎず、実際のエラーが発生して数分後には明らかに悪いことはありません。デバッグが非常に難しい。

自分のアドバイスに従ってみてください。

+0

あなたの説明は理にかなっています。ええ、上記のように、ここで受け取った回答にかかわらず、すべてを適切な実装に戻しています。ありがとう。 – Stunner

0

オブジェクトをデータベースからプルしましたか、プロパティにアクセスしようとしましたか?つまり、障害が処理されるときです。

ある時点でコードがクラッシュする可能性が非常に高いです。

+0

NSManagedObjectsを取り出してコンテナクラスに配置し、オブジェクトのプロパティにアクセスします。なぜ私のコードがクラッシュすると思いますか?私はフォールティングがクラッシュすることなく、パフォーマンスが低下するという印象を受けています(フォールティングについての私の比較的初歩的な理解から)。 – Stunner

+0

バックグラウンドスレッドのプロパティにアクセスするとクラッシュする可能性があり、メインスレッド用のコンテキストを使用して他のスレッドでオブジェクトを作成するとクラッシュする可能性があります。ちょうどあなたがそれをクラッシュさせることができないという理由だけで、数百万の人々が後にクラッシュを見ることを意味するわけではありません... –

+0

あなたが言うことを意味しますか:「...数百万人*後でクラッシュする... "?ありがとう。 – Stunner

関連する問題