2012-07-04 10 views
18

現在のところ、バックグラウンドの子スレッド(その親がメインの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に新しいオブジェクトを作成するときに、私は何をすべきかです:

  1. 保存backgroundMOC上(その変更がmainMOCに1つのレベルを押し上げていると私のテーブルビューには、新しい行を挿入することができること)
  2. 保存mainMOCに、ここで何が起こっている(最終的にはディスクに保存されます)masterMOC

に保存

  • (私は、ディスクへの保存のために準備することができるように)backgroundMOCに保存呼び出すと、UIの更新をトリガし、かつ引き起こすことがありますまだ結果が得られている新しいオブジェクトを挿入するために取得された結果コントローラ一時的なIDです。しかし、masterMOCでsaveを呼び出すと、すべてのオブジェクトに永続IDが割り当てられ、別のUIアップデートが発生し、この新しいオブジェクトの別の行が挿入されます。最後のmasterMOC保存をコメントアウトすることで、重複したエントリは表示されなくなりました。私はここで何か間違っているのですか?これは何らかのバグですか?

    別のアップデート:私はバグをかなり確認したと思います。私はbackgroundMOCでsaveを呼び出し、5秒後にmainMOCとmasterMOCでsaveを呼び出すタイマーを設定します。 ImmediatleyをbackgroundMOCに保存すると、新しい行がテーブルに挿入されます。 5秒後(メインとマスターの保存時)に別の新しい行が挿入されます。 (最初に挿入された行には一時IDがあり、最新の挿入には永続IDが付きます)。

  • 答えて

    11

    私はまったく同じ問題を抱えていました。もちろん、問題が特定のIDであることを知るためにすべてをデバッグすることが特に困難で、忘れ去られた日でした。:)

    私はあなたと同じ構造を持っています。また、NSManagedObjectContextのサブクラスを使用して、バックグラウンドコンテキストとメインコンテキストに保存すると予想される動作をコード化します。つまり、バックグラウンドコンテキストで保存するとメインコンテキスト(そして、メインコンテキストは、外部サービスで変更されたオブジェクトを同期する必要がありますが、これは無関係ですが、なぜ2つのサブクラスがあるのか​​を説明する価値があります)、メインコンテキストに保存するとマスターコンテキストを保存する必要があります。

    (あなたbackgroundMOCに相当)私のRFSImportContextサブクラスでは、私はその後、ブロックはメインコンテキストの内容とobtainPermanentIDsForObjects:を呼び出します(self.parentContextここにあなたのmainMに相当)C、[self.parentContext performBlock:]を呼び出し、[super save:]を呼び出すために- save:を実装します- updatedObjects- insertedObjectsの配列がある場合は、メインコンテキストを保存します。

    あなたが説明しているように、私はもはや一時オブジェクトをNSFetchedResultsControllerに漏らしていません。状況を少し改善する方法は、RFSMainContextサブクラス(やはりmainMOCに相当)を使用して- save:を実装して永続オブジェクトIDを取得し、それを保存してからマスタコンテキストを保存することです。これは、メインコンテキストが保存されたときにオブジェクトの永続的なIDを持つことを常に望んでいるという振舞いをコード化します。

    +2

    あなたのコメントは何とか私を助けましたが、別の方法で助けました。 私はNSFetchedresultscontrollerを使用していました。一時的なIDだけでなく永続的なものも取得していました。ですからコントローラがdidchangecontentを呼び出すたびにgetsPermanentIDsForObjectsを取得します:フェッチされたすべてのオブジェクトに対して、今は完璧に動作します! –

    +0

    @JoãoNunesはまだ私のために働いていない、私のIDはすでに永続的で、このエラーはまだ促している –

    +0

    どのようなエラーがありますか? –

    関連する問題