78 votes

CoreData iCloud + Delete Cascade - comment gérer ?

CoreData Entité "a" a un un-à-plusieurs relation à une collection d' CoreData des Entrées "B", à l'aide d'une Cascade de la suppression de la règle.

Dans un iCloud de l'environnement, alors que l'appareil photo 1 montre une vue de détail de l'un des "B" des entrées de l'appareil 2 supprime la "Une" de l'entrée.

Lorsque l' NSPersistentStoreDidImportUbiquitousContentChangesNotification de notification est reçue dans le dispositif 1, son Délégué d'Application appels mergeChangesFromContextDidSaveNotification puis l'émission d'une notification interne qui est capturée par le point de vue du contrôleur indiquant les détails de l'entrée "B" (le code utilise performBlock où il le devrait).

Cependant, bien que l'entrée "A" est en effet annulé lorsque la vue de détail contrôleur reçoit la notification interne, l'entrée "B" existe toujours valide CoreData objet. Il semble que la Cascade de la règle n'a pas complété son fonctionnement. Par conséquent, le point de vue du contrôleur dans le dispositif 1 n'est pas au courant de la supprimer, ce qui peut conduire à des résultats inattendus.

mergeChangesFromContextDidSaveNotification semble revenir prématurément, lorsque la base de données a été fusionnée, mais la Cascade de la règle n'est pas encore terminée.

J'ai essayé d'actualiser l'entrée "B" lors de la notification arrive, alors temporairement le réglage de l' stalenessInterval de la gestion du contexte de l'objet à zéro si un objet mis en cache ne sera pas utilisé, mais j'ai toujours une entrée valide "B" à partir de la boutique.

Vérifier l' null l'entrée "A" à ce stade, n'est pas une option, parce que la situation est un peu plus complexe que ce que j'ai décrit ici et un nul d'entrée "A" peut être valable dans certains cas.

J'ai essayé d'introduire un retard après fusion, les changements et avant l'envoi de la notification à la vue des contrôleurs. J'ai découvert qu'un délai de 2 secondes n'aide pas, mais un délai de 10 secondes œuvres.

Mais je ne veux pas compter sur ce retard. C'est un environnement de test sans beaucoup de données, et je ne sais pas ce qui va se passer dans un environnement de production. En s'appuyant sur une expérimentation de retard ne semble pas la bonne chose à faire.

Est-il une bonne chose? Ou suis-je en train de faire quelque chose de mal pour commencer?

1voto

Leo Natan Points 25262

À partir de l'expérience, de l'écoute des notifications d'autre que NSManagedObjectContextDidSaveNotification est un gros gâchis et peut conduire à s'appuyer sur des propriétés qui ne sont pas encore mis à jour. La vue de détail contrôleur doit écouter NSManagedObjectContextDidSaveNotification des notifications, qui sont jetés après la cascade est appliquée. Vous pouvez ensuite vérifier par plusieurs moyens si l'objet courant est valide ou pas (vous pouvez vérifier pour voir si l'objet courant est géré contexte de l'objet est - nil ou vous pouvez effectuer une extraction et de voir si l'objet existe dans le magasin).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X