@Zsolt, который определенно выглядит как та же самая ошибка, вызывает повреждение данных, которое вызывает сбой. Я ответил на ваш вопрос с некоторыми подробностями о том, как вы можете проверить файловую систему напрямую, чтобы увидеть, существует ли файл на самом деле или нет. Это может помочь вам.

ратил лучшую часть рабочего дня, пытаясь решить эту проблему.

Фон

У меня есть простая базовая модель данных, с книгами и сессиями чтения. Книги имеют обложки (изображения), которые хранятся в виде двоичных данных с помощью «Разрешить внешнее хранение».

На iOS 11.4 и ниже все работает нормально все время. Когда я сохраняю новый сеанс, все обновляется правильно.

проблема

Начиная с iOS 12, когда я создаю новый сеанс чтения и связываю его с книгой, о каждомвторой время основные данные генерируют оператор SQL, который также обновляет поле обложки книги, что иногда приводит к неправильной ссылке (на файл на диске), что часто приводит к тому, что обложканоль при перезапуске приложения, и почти всегда создает дубликат копии обложки на диске (как это видно в симуляторе_EXTERNAL_DATA папка).

Хотя контекст и объекты в памяти остаются правильными (и, следовательно, все в пользовательском интерфейсе в порядке), пока приложение не будет перезапущено, то крышка частоноль.

iOS 12 специфичный

На iOS 12 я могу детально детектировать ошибку в симуляторе, на физических устройствах, и пользователи также сообщают об ошибке. Я не могу воспроизвести ошибку на iOS 11.4, и ни один пользователь не сообщил об ошибке до iOS 12.

Шаги приняты

Я включил-com.apple.CoreData.ConcurrencyDebug 1", поэтому не должно быть, что я получаю доступ к чему-то из неправильной очереди. Я также включил"-com.apple.CoreData.SQLDebug 3«Так что я могу видеть, что именно написано.

Я убедился, что экземпляр Book (и, следовательно, обложка) не был изменен моим кодом перед установкой связи с новым Session, проверивhasChangesкак раз перед тем как яnewSession.book = book а такжеcontext.save().

Чтобы быть на 100% уверенным, что я не касаюсь свойства cover ни в одном потоке, я закорочил мои методы получения и установки этого свойства. Без улучшения.

Я пытался использоватьobjectID запросить экземпляр книги непосредственно перед ассоциацией и сохранить. Без улучшения.

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

Вопрос

Есть идеи для следующих шагов?

Обновление статуса

Это дефект в iOS 12. См. Принятый ответ ниже для подробного описания приемлемого обходного пути.

Ответы на вопрос(1)

Ваш ответ на вопрос