現在、バックグラウンドの子スレッド (親がメインの UI スレッド コンテキスト) で新しいオブジェクトを作成し、保存するとNSFetchedResultsController
2 つの新しいオブジェクトが表示されるという問題が発生objectID
していobjectID
ます。何かが欠けていない限り、これはある種のバグのようです。
そのため、作成する新しいオブジェクトの永久 ID を手動で取得しようと考えました。これにより、重複する行の問題は修正されますが、新しいランダム エラーが発生します (作成した新しいオブジェクトを参照して、「オブジェクトの障害を実行できませんでした」など)。前述のいずれかが発生している理由について誰かが考えを持っている場合は、共有してください.
obtainPermanentIDs
正しい方向への一歩だと思います。しかし、いつこのメソッドを呼び出すのでしょうか? 子コンテキストに保存する前に? 子を保存した後、親の前に? 親の後?現在、私のセットアップは次のとおりです。
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
で新しいオブジェクトを作成し、backgroundMOC
すぐにディスクに保存する場合 (つまり、3 つのコンテキストすべてで save: を呼び出す必要があります)、どこで を呼び出す必要がありobtainPermanentIDs
ますか?
(または、永久IDの取得を呼び出す以外の別の解決策を誰かが持っている場合はどうすればよいですか?とにかく、このメソッドはどのような問題を解決するために導入されましたか?なぜこのメソッドを呼び出す必要があるのでしょうか?)
更新: 何が起こっているのか理解できたと思います (これは理論にすぎません) が、解決方法はわかりません。Core Data は、オブジェクトが物理的にディスクに保存されるときに、オブジェクトの永続的な ID を生成するようです。したがって、私の場合、masterMOC で save を呼び出すまで、これは発生しません。現在、backgroundMOC で新しいオブジェクトを作成するときに私がしていることは次のとおりです。
- backgroundMOC に保存します (変更が mainMOC の 1 レベル上にプッシュされ、テーブル ビューが新しい行を挿入できるようにするため)
- mainMOC に保存します (ディスクへの保存の準備ができるように)
- masterMOC に保存 (最終的にディスクに保存)
ここで何が起こっているかというと、backgroundMOC で save を呼び出すと UI の更新がトリガーされ、フェッチされた結果コントローラーが一時的な ID しか持たない新しいオブジェクトを挿入します。しかし、次に masterMOC で save を呼び出すと、すべてのオブジェクトに永続的な ID が割り当てられます。これにより、別の UI 更新が発生し、この「新しい」オブジェクトに別の行が挿入されます! 最後の masterMOC 保存をコメント アウトすることで、重複するエントリが表示されなくなりました。ここで何か間違ったことをしているのですか、それともある種のバグですか?
別の更新:バグをほぼ確認したと思います。backgroundMOC で save を呼び出し、5 秒後に mainMOC と masterMOC で save を呼び出すタイマーを設定します。backgroundMOC に保存するとすぐに、新しい行がテーブルに挿入されます。5 秒後 (メインとマスターの保存時)、別の新しい行が挿入されます。(最初に挿入された行には一時 ID があり、最新の挿入には永続 ID があります)。