Identification des valeurs anciennes et nouvelles sur les objects modifiés avec NSManagedObjectContextWillSaveNotification

J'essaie de suivre les modifications apscopes aux objects dans un context de données de base, en suivant le nom des propriétés qui ont changé avec les anciennes et les nouvelles valeurs.

Je me suis inscrit à NSManagedObjectContextWillSaveNotification pour recevoir une notification lorsqu'une sauvegarde est sur le sharepoint se produire, et je peux extraire les objects insérés / mis à jour / supprimés du context … Je peux alors voir les valeurs modifiées en utilisant .changedValues.

Cependant, j'ai des difficultés à récupérer les anciennes valeurs …

Par exemple, j'ai un object qui suit une position, et donc l'un des changements revient avec:

 po [obj changedValues] { originX = 260; originY = 180; } 

Cela me donne les nouvelles valeurs pour les propriétés qui ont changé sur l'object. Pour essayer d'get les anciennes valeurs, j'utilise ensuite changedValuesForCurrentEvent , qui selon les docs devrait returnner

"un dictionary contenant les keys et les anciennes valeurs des propriétés persistantes qui ont changé depuis la dernière publication de NSManagedObjectContextObjectsDidChangeNotification "

Cependant, quand j'essaye cela, il revient vide …:

 po [obj changedValuesForCurrentEvent] { } 

Comment puis-je capturer les anciennes et les nouvelles valeurs?

Vous mélangez vos notifications. NSManagedObjectContextObjectsDidChangeNotification est appelée chaque fois que vous modifiez des valeurs sur un object géré, même si vous n'avez pas encore enregistré les modifications. NSManagedObjectContextWillSaveNotification est appelée plus tard lorsque vous enregistrez. Donc, la séquence est:

  1. Vous modifiez certains attributes -> NSManagedObjectContextObjectsDidChangeNotification est publié et vous pouvez utiliser changedValuesForCurrentEvent pour voir ce qui a changé.
  2. Plus tard, vous sauvegardez les modifications. NSManagedObjectContextWillSaveNotification est publié. Vous pouvez appeler changedValuesForCurrentEvent , mais cela n'est pas utile, car il renvoie des modifications depuis la dernière notification de modification de did . Il n'y a pas de changement depuis la dernière notification de modification. S'il y en avait, vous en auriez reçu un autre. Cette méthode est documentée pour être utile sur une notification did-change, pas sur une notification will-save.

Si vous voulez les anciennes valeurs et que vous voulez les get quand la notification will-save est publiée, vous avez quelques options:

  • Écoutez NSManagedObjectContextObjectsDidChangeNotification . Cache des informations sur les changements dans certains objects de collection (probablement NSDictionary ). Ensuite, lorsque NSManagedObjectContextWillSaveNotification se produit, searchz ces modifications, traitez-les et videz le cache de modifications. OU…
  • Lorsque vous obtenez NSManagedObjectContextWillSaveNotification , créez un second context d'object géré local. Comme il s'agit d'une notification de sauvegarde, vous pouvez toujours récupérer les anciennes valeurs. Ainsi, récupérez chaque object qui est enregistré et comparez les valeurs avant et après pour voir ce qui est différent.

Des sons comme vous devriez appeler " changedValuesForCurrentEvent " seulement quand vous recevez votre notification " NSManagedObjectContextWillSaveNotification " .

Et si " changedValuesForCurrentEvent " renvoie toujours un dictionary ou un object nul, vérifiez si la notification userInfo quelque chose d'utile dans son dictionary " userInfo " lui-même. Il se peut aussi qu'il n'y ait pas eu de NSManagedObjectContextObjectsDidChangeNotification "posté, comme vous l'avez posté des docs là-haut.