2016-09-28 12 views
1

NSFetchedResultsControllerで奇妙な動作が発生しています。これはiOS 10で新しく追加された点です。fetchedObjectsには重複したオブジェクトが含まれています。NSFetchedResultsControllerが重複を返します(同じobjectIDと参照)

これは、私自身の基準では「重複」を意味するものではありません。彼らは文字どおり同じobjectIDと同じ参照を持っています。

それは私のアプリで起こるどのよう

  1. FRCがセットアップされ、実行さ

  2. 2オブジェクト(この例では)フェッチされるフェッチ

  3. 何かが私の同期層で起こります、別のオブジェクト(アイテムとの関係にあるもの)が更新されます

  4. FRCがcont entは変わった。 fetchedObjectsは4つのオブジェクト(2つの重複)

が含まれています。ここcontrollerDidChangeContent方法で私のデバッグからのコンソール出力です。

po frc.fetchedObjects 

    - 0 : <ListItem: 0x1700dc3f0> (entity: ListItem; id: 0x1706294a0 <x-coredata://12D0CB00-7BF4-402A-8371-19DD1CFB1537/ListItem/t3384FC2D-3399-41FE-B7DD-C277922F495445> ; data: { ... } 

    - 1 : <ListItem: 0x1700dc3f0> (entity: ListItem; id: 0x1706294a0 <x-coredata://12D0CB00-7BF4-402A-8371-19DD1CFB1537/ListItem/t3384FC2D-3399-41FE-B7DD-C277922F495445> ; data: { ... } 

    - 2 : <ListItem: 0x1704c49f0> (entity: ListItem; id: 0x170631680 <x-coredata://12D0CB00-7BF4-402A-8371-19DD1CFB1537/ListItem/t3384FC2D-3399-41FE-B7DD-C277922F495446> ; data: { ... } 

    - 3 : <ListItem: 0x1704c49f0> (entity: ListItem; id: 0x170631680 <x-coredata://12D0CB00-7BF4-402A-8371-19DD1CFB1537/ListItem/t3384FC2D-3399-41FE-B7DD-C277922F495446> ; data: { ... } 


(lldb) po frc.fetchedObjects![0].objectID.isEqual(frc.fetchedObjects![1].objectID) 
true 

もう1つの注意:FRCを再作成してオブジェクトを再度フェッチすると、重複はありません。

この問題の原因は何もわかりません。私はそのバグを引き起こしている私のアプリで何か間違っているかもしれない。とにかくFRCが重複したオブジェクトをfetchedObjectsに許しているのは本当に変です。 私はそれをどのようにデバッグすべきか私に何か手がかりを与えてもらえますか?

+0

私は重複が唯一のいくつかのオブジェクトへの変更後にビューの1)の後に現れ、および2)変更がデータベースに反映されていないので、何かがあなたのFRC didChangeデリゲート関数でオフになっている疑いがあると思います。私は、.insertと.moveのケースをAppleの提案コードと比較することに焦点を当てるが、それでも問題がなければ他のコードをチェックすることにしている。私がXcodeベータ版に行ってからしばらくしてきましたが、いくつかのパラメータでAnyObjectからAnyへの切り替え以外の変更は覚えていませんが、バージョン7が気にしていないものには敏感かもしれません。 –

答えて

0

今日も同様の問題が発生しています。私のケースでは、FRCのフェッチされたオブジェクトにすべて一時的なIDがあることに気付きました。これらは、そのように検証することができます。

fetchedResultsController.fetchedObjects[0].objectID.isTemporary 

私のアプリでは、私は明示的に新しいデータがインポートされる/更新/同期側のコンテキストを保存する前に、すべての挿入したオブジェクトのための恒久的なオブジェクトIDを要求し、この問題を回避するには:

NSError *error; 
[bgContext obtainPermanentIDsForObjects:bgContext.insertedObjects.allObjects error:&error]; 
関連する問題