ios core-data icloud cascading-deletes

ios - CoreData+iCloud+Cascade Delete-¿cómo manejarlo?



core-data cascading-deletes (1)

CoreData Entity "A" tiene una relación de uno a muchos con una colección de entradas de CoreData "B", utilizando una regla de eliminación en cascada.

En un entorno de iCloud , mientras que el dispositivo 1 muestra una vista de detalle de una de las entradas "B", el dispositivo 2 borra la entrada "A".

Cuando se NSPersistentStoreDidImportUbiquitousContentChangesNotification notificación NSPersistentStoreDidImportUbiquitousContentChangesNotification en el dispositivo 1, su delegado de aplicaciones llama a mergeChangesFromContextDidSaveNotification y luego transmite una notificación interna que es capturada por el controlador de vista que muestra los detalles de la entrada "B" (el código usa performBlock donde debería).

Sin embargo, aunque la entrada "A" está de hecho anulada cuando el controlador de vista de detalle recibe la notificación interna, la entrada "B" todavía existe como un objeto CoreData válido. Parece que la regla de Cascade aún no ha completado su operación. Por lo tanto, el controlador de vista en el dispositivo 1 no tiene conocimiento de la eliminación, lo que puede generar resultados inesperados.

mergeChangesFromContextDidSaveNotification parece regresar prematuramente, cuando los datos base se han fusionado pero la regla de Cascade aún no se ha completado.

Traté de actualizar la entrada "B" cuando llega la notificación mientras establezco temporalmente el stalenessInterval de stalenessInterval del contexto del objeto gestionado a cero para que no se use un objeto en caché, pero sigo recibiendo una entrada "B" válida de la tienda.

Buscar una entrada null "A" en este punto no es una opción, porque la situación es algo más compleja que lo que describí aquí y una entrada nula "A" puede ser válida en algunos casos.

Traté de introducir un retraso después de fusionar los cambios y antes de enviar la notificación interna a los controladores de vista. Descubrí que una demora de 2 segundos no ayuda, pero funciona un retraso de 10 segundos.

Pero no quiero confiar en este retraso. Este es un entorno de prueba sin demasiados datos, y no sé qué sucederá en un entorno de producción. Confiar en un retraso experimental no parece lo correcto.

¿Hay algo correcto? ¿O estoy haciendo algo mal para empezar?


Por experiencia, escuchar notificaciones que no sean NSManagedObjectContextDidSaveNotification es un gran desastre y puede llevar a confiar en propiedades que aún no están actualizadas. El controlador de vista detallada debe escuchar las notificaciones NSManagedObjectContextDidSaveNotification , que se lanzan después de aplicar la cascada. Luego 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 es nil o puede realizar una búsqueda y ver si el objeto existe en la tienda).