143 votes

Comment puis-je savoir si un objet a un observateur clé-valeur attaché.

Si vous dites à un objet objective c de supprimer les observateurs pour un chemin clé et que ce chemin clé n'a pas été enregistré, il se casse la figure. comme -

Impossible de supprimer un observateur pour le chemin de clé "theKeyPath", car il n'est pas enregistré en tant qu'observateur.

existe-t-il un moyen de déterminer si un objet a un observateur enregistré, afin que je puisse faire ceci

if (object has observer){
  remove observer
}
else{
  go on my merry way
}

317voto

Adam Points 1224

Mettez un try catch autour de votre appel removeObserver

@try{
   [someObject removeObserver:someObserver forKeyPath:somePath];
}@catch(id anException){
   //do nothing, obviously it wasn't attached because an exception was thrown
}

37voto

Peter Hosey Points 66275

La vraie question est de savoir pourquoi vous ne savez pas si vous l'observez ou non.

Si vous faites cela dans la classe de l'objet observé, arrêtez. La personne qui l'observe s'attend à ce qu'elle continue à l'observer. Si vous coupez les notifications de l'observateur sans qu'il le sache, attendez-vous à ce que les choses se cassent ; plus précisément, attendez-vous à ce que l'état de l'observateur devienne obsolète car il ne reçoit plus de mises à jour de l'objet précédemment observé.

Si vous faites cela dans la classe de l'objet observateur, rappelez-vous simplement quels objets vous observez (ou, si vous n'observez jamais qu'un seul objet, si vous l'observez). Si l'observateur possède l'observé, il suffit d'ajouter l'observateur après avoir créé ou conservé l'observé, et de supprimer l'observateur avant de libérer l'observé.

L'ajout et la suppression d'un objet en tant qu'observateur doivent généralement se faire dans la classe de l'observateur, et jamais dans celle de l'objet observé.

25voto

MattDiPasquale Points 23842

POUR INFO, [someObject observationInfo] semble être nil si someObject n'a pas d'observateurs. Je ne me fierais pas à ce comportement, cependant, car je ne l'ai pas vu documenté. De plus, je ne sais pas comment lire les fichiers observationInfo pour obtenir des observateurs spécifiques.

4voto

Leibowitzn Points 609

La seule façon de le faire est de définir un drapeau lorsque vous ajoutez un observateur.

2voto

adonoho Points 2983

L'objectif du modèle d'observation est de permettre à une classe observée d'être "scellée", c'est-à-dire de ne pas savoir ou de ne pas se soucier de savoir si elle est observée. Vous essayez explicitement de briser ce modèle.

Pourquoi ?

Le problème que vous rencontrez est que vous supposez que vous êtes observé alors que ce n'est pas le cas. Cet objet n'a pas déclenché l'observation. Si vous voulez que votre classe ait le contrôle de ce processus, vous devriez envisager d'utiliser le centre de notification. De cette façon, votre classe a un contrôle total sur le moment où les données peuvent être observées. Par conséquent, elle ne se soucie pas de savoir qui observe.

Andrew

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