現在のところ、バックグラウンドの子スレッド(その親がメインのUIスレッドコンテキストです)に新しいオブジェクトを作成して保存すると、NSFetchedResultsController
には2つの新しいオブジェクトが表示されます:1つは一時的なobjectID
、パーマネントobjectID
。これは私が何かを逃していない限り、何らかの不具合のようです。obtainPermanentIDsForObjectsを呼び出すタイミング:
私は手動で作成する新しいオブジェクトの永久IDを手動で取得すると考えました。これにより、行の重複問題は修正されますが、新しいランダムエラー(「オブジェクトのフォルトを実行できませんでした」などの新しいオブジェクトが参照されます)が発生します。なぜ誰かが以前に言及されたことのいずれかについてのアイデアを持っているなら、分かち合ってください。
私はobtainPermanentIDs
が正しい方向への一歩だと思います。しかし、いつこのメソッドを呼び出すのですか?子のコンテキストに保存する前に?子供を預けた後、親の前に?親の後? 現在、私のセットアップはこれです:私はbackgroundMOC
に新しいオブジェクトを作成し、私は(私はsaveを呼び出す必要があります意味:すべての3つのコンテキストで)ディスクに保存しすぐにしようとするのであれば
masterMOC - private queue tied to the persistent store, so physical saves happen here
----mainMOC - main queue tied to the UI, child of masterMOC
-------backgroundMOC - private queue, child of mainMOC
、どこ私はobtainPermanentIDs
と呼ぶべきですか?
(または誰でも永続的なIDを取得呼び出す以外の別のソリューションを持っている場合、この方法は、とにかく解決するためにどのような問題が導入されたのはなぜ私は、このメソッドを呼び出したいでしょうか???)
更新: 私は思います私は何が起こっているのかを理解しましたが(それは唯一の理論ですが)、それを解決する方法ではありません。コアデータは、オブジェクトが物理的にディスクに保存されるときに、オブジェクトの永続IDを生成するように見えます。私の場合、masterMOCでsaveを呼び出すまで、これは起こりません。現在backgroundMOCに新しいオブジェクトを作成するときに、私は何をすべきかです:
- 保存backgroundMOC上(その変更がmainMOCに1つのレベルを押し上げていると私のテーブルビューには、新しい行を挿入することができること)
- 保存mainMOCに、ここで何が起こっている(最終的にはディスクに保存されます)masterMOC
に保存
別のアップデート:私はバグをかなり確認したと思います。私はbackgroundMOCでsaveを呼び出し、5秒後にmainMOCとmasterMOCでsaveを呼び出すタイマーを設定します。 ImmediatleyをbackgroundMOCに保存すると、新しい行がテーブルに挿入されます。 5秒後(メインとマスターの保存時)に別の新しい行が挿入されます。 (最初に挿入された行には一時IDがあり、最新の挿入には永続IDが付きます)。
あなたのコメントは何とか私を助けましたが、別の方法で助けました。 私はNSFetchedresultscontrollerを使用していました。一時的なIDだけでなく永続的なものも取得していました。ですからコントローラがdidchangecontentを呼び出すたびにgetsPermanentIDsForObjectsを取得します:フェッチされたすべてのオブジェクトに対して、今は完璧に動作します! –
@JoãoNunesはまだ私のために働いていない、私のIDはすでに永続的で、このエラーはまだ促している –
どのようなエラーがありますか? –