CoreData
La entidad "A" tiene una relación de uno a varios con una colección de CoreData
entradas "B", mediante una regla de eliminación en cascada.
En un iCloud
entorno, mientras que el dispositivo 1 muestra una vista detallada de una de las entradas "B", el dispositivo 2 elimina la entrada "A".
Cuando NSPersistentStoreDidImportUbiquitousContentChangesNotification
se recibe la notificación en el dispositivo 1, su App Delegate llamamergeChangesFromContextDidSaveNotification
y luego transmite una notificación interna que es capturada por el controlador de vista mostrando los detalles de la entrada "B" (el código usa performBlock
donde debería).
Sin embargo, aunque la entrada "A" se anula cuando el controlador de vista de detalles recibe la notificación interna, la entrada "B" todavía existe como una CoreData
objeto . Parece que la regla Cascade aún no ha completado su operación. Por lo tanto, el controlador de vista en el dispositivo 1 no está al tanto de la eliminación, lo que puede generar resultados inesperados.
mergeChangesFromContextDidSaveNotification
parece regresar prematuramente, cuando los datos base se han fusionado pero la regla en cascada aún no se ha completado.
Intenté actualizar la entrada "B" cuando llega la notificación mientras configuraba temporalmente la stalenessInterval
contexto del objeto administrado en cero para que no se usara un objeto almacenado en caché, pero todavía obtengo una entrada válida "B" de la tienda.
Comprobando un null
entrada "A" en este punto no es una opción, porque la situación es algo más compleja de lo que describí aquí y una entrada nula "A" puede ser válida en algunos casos.
Intenté introducir un retraso después de fusionar los cambios y antes de enviar la notificación interna a los controladores de vista. Descubrí que un retraso de 2 segundos no ayuda, pero un retraso de 10 segundos funciona.
Pero no quiero depender de este retraso. Este es un entorno de prueba sin muchos datos y no sé qué pasará en un entorno de producción. Depender de un retraso experimental no parece lo correcto.
¿Hay algo correcto? ¿O estoy haciendo algo mal para empezar?
fuente
Respuestas:
Por experiencia, escuchar otras notificaciones
NSManagedObjectContextDidSaveNotification
es un gran lío y puede llevar a confiar en propiedades que aún no se han actualizado. El controlador de vista de detalles debe escuchar lasNSManagedObjectContextDidSaveNotification
notificaciones, que se lanzan después de que se aplica la cascada. A continuación, puede verificar por varios medios si el objeto actual es válido o no (puede verificar si el contexto del objeto administrado del objeto actual lo esnil
o puede realizar una búsqueda y ver si el objeto existe en la tienda).fuente