roblema específico de @iOS 12: corrupción de datos binarios de almacenamiento externo de datos centrales

Pasé la mayor parte de un día de trabajo tratando de resolver esto.

Fond

Tengo un modelo de datos básicos simple, con libros y sesiones de lectura. Los libros tienen portadas (imágenes) que se almacenan como datos binarios con "Permite almacenamiento externo".

En iOS 11.4 y versiones inferiores, todo funciona bien todo el tiempo. Cuando guardo una nueva sesión, todo se actualiza correctamente.

Problem

esde iOS 12, cuando creo una nueva sesión de lectura y la vinculo al libro, sobre cadasegund time, los datos centrales generan una instrucción SQL que también actualiza el campo de la portada del libro, lo que a veces resulta en una referencia incorrecta (para archivar en el disco) que a menudo resulta en la portada ennul al reiniciar la aplicación, y casi siempre crea una copia duplicada de la cubierta en el disco (como se puede ver en Simulator's_EXTERNAL_DATA carpeta).

Sin embargo, el contexto en memoria y los objetos permanecen correctos (y todo en la interfaz de usuario está bien, por lo tanto), hasta que se reinicie la aplicación, entonces la cubierta a menudo esnul.

iOS 12 específico

En iOS 12, puedo reproducir de forma determinista el error en el simulador, en dispositivos físicos, y los usuarios también han informado del error. No puedo reproducir el error en iOS 11.4 y ningún usuario informó el error antes de iOS 12.

Pasos tomado

He habilitado "-com.apple.CoreData.ConcurrencyDebug 1 ", así que no debería ser que estoy accediendo a nada desde la cola incorrecta. También he habilitado"-com.apple.CoreData.SQLDebug 3 "para que pueda ver exactamente lo que se escribe.

Me he asegurado de que la instancia del Libro (y, por lo tanto, la portada) no esté modificada por mi código antes de la asociación con la nueva Sesión marcandohasChanges, justo antes que yonewSession.book = book ycontext.save().

Para estar 100% seguro de que no estoy tocando la propiedad de la cubierta en ningún hilo, he hecho un cortocircuito en mis captadores y establecedores para esa propiedad. Sin mejora

He intentado usarobjectID para solicitar una instancia del libro justo antes de la asociación y guardar. Sin mejora

Incluso probé la opción donde el contexto mantiene fuertes referencias a todos los objetos, solo para asegurarme de que no era algún tipo de problema de administración de memoria. Sin mejora

Pregunt

¿Alguna idea para los próximos pasos?

Actualización de estad

Esto es un defecto en iOS 12. Consulte la respuesta aceptada a continuación para obtener una descripción detallada de una solución razonable.