La détection des changements à un attribut spécifique de NSManagedObject

Comment puis-je détecter les modifications apportées à un attribut spécifique d'un NSManagedObject? Dans ma Base de Données modèle de données, j'ai un Product entité qui représente un produit pour la vente. Le Product entité possède plusieurs attributs: price, sku, weight, numberInStock, etc. Chaque fois que le price attribut d'une Product changements, j'ai besoin d'effectuer un long calcul. Par conséquent, je voudrais savoir quand le price attribut de tout Product changements, [edit] même si ce changement provient de la fusion d'un contexte sauvegardé sur un autre thread. Ce qui est une bonne façon de faire? J'ai des milliers de Product objets dans ma boutique; évidemment, il n'est pas possible d'envoyer chacun un addObserver message.

J'ai été en utilisant NSManagedObjectContextObjectsDidChangeNotification pour détecter les changements, mais il ne m'avise que un objet géré a changé, pas qui attribut de l'objet a changé. J'ai pu refaire le calcul à chaque fois qu'il y a tout changer pour un Product, mais que les résultats inutiles recalculs chaque fois qu'un attribut de pertinence a changé. J'envisage de faire un Price entité (qui ne contient qu'un price attribut) et à l'aide d'une relation entre Product et Price. De cette façon, je peux détecter les changements de Price objets afin de lancer le calcul. Cela semble trop encombrants pour moi. Est-il un meilleur moyen?

Mise à jour:

@railwayparade remarquer que je pouvais utiliser le changedValues méthode de NSManagedObject pour déterminer les propriétés ont été modifiées pour chaque objet mis à jour. J'ai complètement raté cette méthode, et il serait totalement résoudre mon problème, si les modifications n'ont pas été faites sur un thread d'arrière-plan et fusionnés dans le contexte du thread. (Voir le paragraphe suivant.)

J'ai complètement loupé une subtilité dans la manière dont NSManagedObjectContextObjectsDidChangeNotification œuvres. Aussi loin que je peux dire, quand un objet géré contexte sauvegardé sur un autre thread est fusionné dans un contexte du thread principal (à l'aide d'un mergeChangesFromContextDidSaveNotification:), le résultat NSManagedObjectContextObjectsDidChangeNotification seulement contient modifier des informations sur des objets qui sont actuellement dans le thread principal est géré contexte de l'objet. Si un changement de l'objet n'est pas dans le thread principal du contexte, il ne sera pas une partie de la notification. Il est logique, mais n'est-ce pas ce à quoi je m'attendais. Donc, mon idée d'utiliser une relation au lieu d'un attribut dans l'ordre pour obtenir plus d'informations de changement en fait, il faut examiner le contexte du thread NSManagedObjectContextDidSaveNotification, pas le thread principal de l' NSManagedObjectContextObjectsDidChangeNotification. Bien sûr, il serait beaucoup plus intelligent d'utiliser simplement la changedValues méthode de NSManagedObject comme @railwayparade obligeamment indiqué. Cependant, je suis toujours à gauche avec le problème que la notification de modification de la fusion sur le thread principal ne sera pas nécessairement contenir toutes les modifications effectuées sur le thread d'arrière-plan.