2016-09-28 2 views
1

У меня возникло странное поведение с NSFetchedResultsController. Это новое в iOS 10. Прямо к точке: fetchedObjects содержит дубликаты объектов.NSFetchedResultsController возвращает дубликаты (тот же идентификатор объекта и ссылка)

Это не означает «дублировать» по моим собственным критериям. Они буквально имеют одинаковые идентификаторы объектов и одну и ту же ссылку.

Как это происходит в моем приложении:

  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 

Другое примечание: когда я снова создаю FRC и извлекаю объекты, дубликатов нет.

Я просто понятия не имею, что может вызвать эту проблему. Возможно, я ошибаюсь в своем приложении, что вызывает эту ошибку. В любом случае, это действительно странно, что FRC допускает дублирование объектов в fetchedObjects. Не могли бы вы дать мне понять, как мне его отладить?

+0

Я подозреваю, что-то выключен в ваших функциях делегатов FRC didChange, так как дублирует показать 1) после того, как с точки зрения только после изменения в некоторых объектов, и 2) изменение не отражается в базе данных , Я бы сосредоточился на сравнении случаев .insert и .move с предлагаемым кодом Apple, но если они в порядке, проверьте остальные. Прошло некоторое время с тех пор, как я пошел на бета-версию Xcode, но я не помню никаких изменений здесь, кроме переключения с AnyObject на Any в некоторых параметрах, но они могут быть чувствительны к тому, что не было в версии 7. –

ответ

0

Сегодня я столкнулся с подобной проблемой. Я заметил, что в моем случае набранные объекты на FRC имели временные идентификаторы. Это можно проверить следующим образом:

fetchedResultsController.fetchedObjects[0].objectID.isTemporary 

Чтобы обойти эту проблему в моем приложении я явно запросить постоянные идентификаторы объектов для всех вставленных объектов перед сохранением контекста, на котором новые данные импортируемого/обновление/синхронизация:

NSError *error; 
[bgContext obtainPermanentIDsForObjects:bgContext.insertedObjects.allObjects error:&error];