Объекты неправильной сущности, извлеченные из отношения CoreData

#ios #core-data

#iOS #core-данные

Вопрос:

У меня довольно большая модель CoreData, которая внезапно ведет себя странно. Есть три соответствующих объекта:

  • Пользователь
  • История
  • Группа

User имеет отношение «ко многим», присвоенное stories Story объектам, и отношение groups «ко многим» к Group объектам. Оба также имеют соответствующее обратное значение. Я использую mogenerator для создания удобных средств доступа для всех свойств и отношений. Оба упорядочены по множеству отношений.

Теперь иногда случается, что, когда я запрашиваю у пользовательского объекта его groups (например user.groups ), я фактически получаю упорядоченный набор объектов XNGStory. В тех немногих случаях, когда я наблюдал это, это были те же объекты, которые возвращаются user.stories . Два набора не были одинаковыми (разные указатели), но их содержимое было (я проверил, вызвав array] valueForKeyPath:@"objectID.URIRepresentation"] их, и получил одинаковые URI в одном и том же порядке в обоих случаях).

Такое ощущение, что в моем приложении есть какой-то способ, который хранит истории в groups отношениях, но я проверил код, и есть только классы, связанные с Groups, касающиеся groups relationship, и только классы, связанные с story, касающиеся story -relationship . Кроме того, между ними нет взаимодействия или взаимосвязи, они используются в совершенно разных частях приложения, поэтому я понятия не имею, как может произойти такое повреждение данных.

Есть ли какая-либо причина, по которой может произойти такое повреждение данных? Я бы ожидал, что CoreData будет жаловаться, когда я случайно сохраняю объекты в неправильных отношениях.

Еще одна вещь: пока мы смогли воспроизвести ее только на iOS 10.

То, что мы пробовали:

  • Сначала мы заподозрили проблему с памятью (потому что объект неправильного типа появляется там, где его не должно быть), но запуск с включенными средствами очистки адресов и NSZombies не выявил никаких проблем. Кроме того, как только проблема возникает, она сохраняется при перезапуске приложения, и использование отладчика для поиска объектов также показывает согласованную (ly неправильную) модель данных, так что ошибочен не только один указатель.
  • Деактивированный WAL (проблема все еще существует)
  • Просмотрел файл sqlite (как с WAL, так и без него) после сбоя в редакторе Core Data: он отображает групповые объекты для groups отношения, поэтому все кажется хорошим на уровне sqlite-database-level -> Каким-то образом отношения перепутываются при загрузке из файла.

Ответ №1:

Насколько я могу судить, это, похоже, ошибка iOS 10.

У нас аналогичная проблема с приложением, которое использует Core Data — пользовательский объект имеет адреса отношений (для адресации объектов) и друзей (для других пользовательских объектов).).

По какой-то причине в iOS 10 Core Data иногда выбирает возврат объектов адресов в отношениях Friends.

Мы провели регрессионное тестирование до iOS 9, и эта проблема не возникает.

В Open Radar есть открытая ошибка для той же проблемы — 26826183. Интересно, что мы начали видеть эту проблему только в версии 10.0.2, но этот отчет Radar был основан на ранней бета-версии iOS 10.

Комментарии:

1. Я получаю сообщения от пользователей приложения о том, что Core Data имеет ошибки и не может извлекать данные. У обоих пользователей установлена версия 10.0.2.

Ответ №2:

Мы тщательно протестировали это и также пришли к выводу, что это ошибка iOS 10. Похоже, это также не связано ни с одним из наших кодов, только с моделью данных. Мы смогли воссоздать проблему в примере проекта, используя нашу модель данных, генерацию кода Xcode 8 и новую версию iOS 10 NSPersistentContainer (до того, как она сломалась с помощью mogenerator и «старого способа настройки стека CoreData»).

Чтобы воспроизвести проблему, мы делаем следующее:

  1. При запуске, если нет User объекта, создайте User объект, добавьте к нему 10 Group объектов и сохраните.
  2. Затем добавьте Story к нему a, все еще в основном контексте, и сохраните.
  3. Завершите работу приложения (с помощью прокрутки iOS вверх или просто нажав «стоп» в Xcode)
  4. Запустите приложение снова. При запуске извлеките User объект, добавьте Story объект в stories отношение и сохраните.
  5. Проверьте user.groups связь в фоновом или основном контексте. Теперь он содержит XNGStory объекты, хотя у него все еще должны XNGGroup быть объекты.

Я отправил радар с примером проекта. OpenRadar здесь (без примера проекта, поскольку он содержит нашу модель данных).

Проблема, по-видимому, сильно зависит от настройки модели данных. Это происходит, когда упорядочены отношения all-but-on для нашей User сущности. Если все упорядочены, этого не происходит, и это не происходит, если два или более неупорядочены.