2009-07-02 12 views
4

Je suis frappé par KVC/KVO. Super puissant. Mais il y a un problème. J'essaie d'être vrai le etho MVC mais je ne vois aucun moyen d'utiliser un modèle d'observation pour surveiller l'allocation ou la désallocation d'une instance de classe Objective-C.Comment observer la création/destruction d'une instance d'objet?

Ceci est réellement important car j'ai un modèle avec une messagerie interne à grain fin que je veux observer à partir d'un contrôleur (ou d'un délégué). La pierre d'achoppement pour moi est que je ne vois pas comment, en dehors du modèle, je peux retirer un observateur pour un sous-composant sur le point d'être désaffecté sans que le contrôleur ne sache la logique interne du modèle qui compromettrait l'encapsulation. Est-ce que quelqu'un peut suggérer une approche pour ce scénario?

Merci, Doug

Répondre

6

Doug - il n'y a vraiment pas assez d'informations dans votre description pour savoir ce que vous faites et comment vous pouvez le mieux (ou si c'est approprié) appliquer KVO au problème.

KVO est tout au sujet de l'observation des propriétés sur les objets. En général, vous ne devriez pas vous soucier quand ils sont créés ou détruits, sauf dans la mesure où vous devez cesser de les observer avant qu'ils ne soient détruits.

Vous devriez plutôt commencer et cesser d'observer des objets lorsque ces objets vous intéressent. Considérez un package de dessin graphique dans lequel un document a un tableau ordonné de formes et vous souhaitez observer la propriété backgroundColor de chaque forme.

Nous n'essaierions pas d'observer l'instanciation et la désallocation de l'instance Shape, mais nous observerions plutôt la propriété "shapes" sur le document. Grâce à cet observateur, nous pouvons déterminer quand une forme est ajoutée ou retirée du document. Quand une forme est ajoutée au document, nous commençons à l'observer. Quand il est retiré du document, nous arrêtons de l'observer. (Notez qu'il peut être supprimé du document mais non désalloué, s'il se trouve sur la pile d'annulation, etc.)

Dans le graphique d'objets pour votre modèle, pour utiliser KVO, vous devez ajouter et supprimer les objets. à partir de votre graphe d'objet d'une manière compatible avec le KVO afin que vous puissiez observer les mutations de la relation, et dans cet observateur, démarrer et arrêter les observateurs de propriété sur les objets associés.

+0

Vous l'avez cloué Jim. Merci pour la clarification. J'ai complètement ignoré le fait que c'est l'ivar se référant à l'instance de l'objet que je devrais observer, pas l'instance elle-même. Et plus loin, en utilisant dot syntac - grandparent.parent.child - je peux observer n'importe quoi dans le graphe d'objet. Je suppose qu'il existe un modèle KVO pour observer les collections, oui? 2 pouces vers le haut Jim. -Doug – dugla

+1

Vous remarquez la propriété pour cette relation. Dans mon application de dessin, vous observeriez la propriété "shapes". En tant qu'implémenteur de l'objet document, je dois m'assurer que chaque fois que je mute le _shapes ivar, je le fais de manière conforme au KVO. Parcourez NSKeyValueObserving.h pour voir quelles notifications KVO vous devriez encapsuler la mutation de la relation, et quelles informations vous pouvez vous attendre à voir dans votre rappel d'observateur lorsque de telles mutations sont faites. –

1

Je pense que vous devrez poster les notifications vous, sauf si vous utilisez quelque chose comme CoreData. Si vous utilisez CoreData, NSManagedObject (la classe racine de tous les objets CoreData stockés) a une méthode -awakeFromInsert qui est appelée après que l'objet a été créé et inséré dans le ManagedObjectContext. En ce qui concerne la destruction, vous pourriez probablement juste poster une notification dès que vous entrez dans la méthode -dealloc.

0

Je ne suis pas sûr exactement ce que vous essayez d'atteindre, donc un peu plus d'explications serait bon.

Si vous voulez juste supprimer un observateur avant que l'objet observé ne soit désalloué, alors ne vous inquiétez pas, car KVO le gérera. Même si vous utilisez des notifications, cela ne causera pas de problème, vous ne recevrez aucune notification de l'objet.

Si vous essayez d'observer plusieurs objets (par exemple un tableau de widgets) et que vous souhaitez savoir quand un objet est ajouté ou supprimé, KVO peut le gérer également. Il suffit de faire du tableau une clé sur votre objet modèle et de l'observer avec KVO. Vous devez également modifier le tableau de manière conforme à la norme KVO (par exemple, mutableArrayForKey: ou utilisez vos propres willChangeValueForKey et didChangeValueForKey).

+0

Merci Tom. Très utile aussi. À votre santé. – dugla

Questions connexes