#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»).
Чтобы воспроизвести проблему, мы делаем следующее:
- При запуске, если нет
User
объекта, создайтеUser
объект, добавьте к нему 10Group
объектов и сохраните. - Затем добавьте
Story
к нему a, все еще в основном контексте, и сохраните. - Завершите работу приложения (с помощью прокрутки iOS вверх или просто нажав «стоп» в Xcode)
- Запустите приложение снова. При запуске извлеките
User
объект, добавьтеStory
объект вstories
отношение и сохраните. - Проверьте
user.groups
связь в фоновом или основном контексте. Теперь он содержитXNGStory
объекты, хотя у него все еще должныXNGGroup
быть объекты.
Я отправил радар с примером проекта. OpenRadar здесь (без примера проекта, поскольку он содержит нашу модель данных).
Проблема, по-видимому, сильно зависит от настройки модели данных. Это происходит, когда упорядочены отношения all-but-on для нашей User
сущности. Если все упорядочены, этого не происходит, и это не происходит, если два или более неупорядочены.