KVO - Comment faire pour vérifier si un objet est un observateur?
Lors de l'observation d'une valeur sur un objet en utilisant addObserver:forKeyPath:options:context:
, finalement, vous aurez envie d'appeler removeObserver:forKeyPath:
sur l'objet à nettoyer plus tard. Avant cela, cependant, est-il possible de vérifier si un objet est en fait l'observation que la propriété?
J'ai essayé de faire en sorte dans mon code qu'un objet n'est que d'avoir un observateur été retiré quand il a besoin d'être, mais il ya certains cas où il est possible que l'observateur peut essayer d'éliminer lui-même deux fois. Je suis en train de travailler pour éviter cela, mais juste au cas où, j'ai juste été à essayer de comprendre si il existe un moyen de vérifier d'abord si mon code est en réalité un observateur de quelque chose.
- KVO car elle est assez brut de l'API. Il y a des bibliothèques qui simplifient son utilisation et vous permettent même d'utiliser les blocs pour des raisons de commodité. Découvrez thirdcog.ue/pwcblocks/#goodies pour plus de détails. J'ai aussi ma propre mise en œuvre, avec la possibilité de supprimer automatiquement les observateurs lorsque l'objet est libéré. Il n'a pas été testé dans des applications réelles, mais vous voudrez peut-être jeter un coup d'oeil de toute façon. Recherche pour
tastykvo
sur GitHub.
Vous devez vous connecter pour publier un commentaire.
Pas. Lorsque vous traitez avec KVO vous devez toujours avoir la suite de modèle à l'esprit:
Lors de l'établissement d'une observation, vous êtes responsable de la suppression de l'exacte observation. Une observation est identifié par son contexte—par conséquent, le contexte doit être unique. Lors de la réception des notifications (et, dans le Lion, lors de la suppression de l'observateur), vous devriez toujours tester pour le contexte, pas le chemin.
La meilleure pratique pour la manipulation des objets observés est, pour enlever et d'établir l'observation dans l'incubateur de l'objet observé:
Lors de l'utilisation de KVO vous avez à faire en sorte que les deux objets, des observateurs et des observee, sont en vie aussi longtemps que l'observation est en place.
Lors de l'ajout d'une observation que vous avez pour l'équilibrer avec exactement la suppression d'une même observation. Ne supposez pas, vous êtes le seul à utiliser KVO. Les classes du Framework peut utiliser KVO pour leurs propres fins, il faut donc toujours vérifier le contexte dans le rappel.
Un dernier point que je voudrais souligner: L'observateur de la propriété doit être KVO conforme. Vous ne pouvez pas vous observez quelque chose d'.
context
. Puisque nous ne savons pas ce que les autres personnes de l'utiliser comme un contexte, ce qui semble être une belle façon de créer une valeur qui est très rare pour être utilisé avant.static
modificateur de classe de stockage pour cacher son symbole à l'extérieur de l'actuelle unité de compilation (== le rendre privé).static int
, j'ai utilisé unNSNumber
ivar est initialisée avecNO
à l'initialisation et est mis àYES
lorsque j'ai mis l'observateur. De cette façon, j'ai encore une adresse unique pour l'objet et supprimer l'observateur seulement si nécessaire dans ledealloc
même si je n'ai pas (je viens de vérifier pour leBOOL
valeur de monNSNumber
).[NSNumber numberWithBool:YES]
en tant que KVO contexte. Ce n'est pas unique (souvent utilisé NSNumbers sont réutilisés). À l'aide de la variable d'instance est l'adresse est sûr, cependant.init
). Alors on peut être sûr qu'à la première fois, la méthode est appelée la ivar estnil
et la removeObserver message est ignoré.Partie de la NSKeyValueObserving protocole est: est-ce
qui devrait dresser la liste des observateurs.
MODIFIER
Utile uniquement pour le débogage.
observationInfo
est documenté pour retourner un pointeur opaque (ce qui, en effet, peut ou ne peut pas être un objet). Est-ce que son précis?po [observedObject observationInfo]
et vous obtenez un bon aperçu des observateurs et des chemins de clé.Je circonscrire cet objectif-c question. Mais depuis, beaucoup de gens l'utilisation de Swift/objective-c ensemble, je pensais que je pointe l'avantage de l'Swift4 nouvelle API sur les anciennes versions de KVO:
Si vous ne
addObserver
plusieurs fois pour KVO, puis pour chaque modification que vous aurez laobserveValue
aussi nombreux que le nombre de fois que vous avez ajouté vous-même en qualité d'observateur.removeObserver
autant de fois que vous avez ajouté.La Swift4
observe
est bien plus intelligent et swiftier!invalidate
de latoken
est assez.invalidat
ing-il avant le début de l'observateur ou de plus de temps que ce que vous avez faitobserve
ne sera pas provoquer un accidentDonc, pour répondre spécifiquement à votre question, si vous utilisez la nouvelle Swift4 KVO, vous n'avez pas besoin de s'en soucier. Appelez simplement
invalidate
et vous êtes bon. Mais si vous utilisez l'ancienne API, reportez-vous ensuite à Nikolai réponseNotificationCenter
: AppelNotificationCenter.default.removeObserver
ne sera pas un problème si vous ne l'avez pas faitaddObserver
encore. Aussi appeladdObserver
plusieurs fois entraînera plusieurs rappels à votre sélection. Donc NotificationCenter est sans danger pour la lors du retrait, mais ce n'est pas très intelligent pour l'ajout.