2016-07-22 1 views
0

J'essaie d'implémenter une valeur de clé de sécurité en observant les mots de passe. Supposons que j'ai un objet de modèle de données nommé person qui a une propriété workplace. Le workplace à son tour un address bien que je souhaite observer donc je mis en place la valeur clé observation à l'appel suivant:Valeur de la clé de sécurité Observation des données clés

[person addObserver:theObserver 
     forKeyPath:@"workplace.address" 
      options:NSKeyValueObservingOptionNew 
      context:NULL]; 

Cela fonctionne bien jusqu'à ce que la personne ne change pas le lieu de travail. Dès que cela se produit:

person.workplace = newWorkplace; 

le système KVC bloque l'application correctement en disant que « oldAddress a été désallouée tandis que les observateurs de valeur clés étaient encore enregistrées avec elle ». (étant oldAddress l'adresse du lieu de travail précédent).

Malheureusement je ne peux pas modifier la mise en œuvre de la classe d'objet « personne » pour informer l'observateur que le lieu de travail va disparaître. Y a-t-il un modèle pour éviter ce genre de crash? Peut-être que l'on peut obtenir d'autres notifications? Comment le keypath est-il traversé dans le cas de KVC et avez-vous accès à cette chaîne?

Répondre

1

Edit 2

Après avoir passé plus de temps avec KVO, je trouve que dans votre cas, vous devriez observerez person.workplace.address au lieu de workplace.address. Lorsque vous observez person.workplace.address, vous réalisez 2 choses:

1) Comme vous possédiez l'objet person, vous avez un contrôle absolu sur le cycle de vie de votre objet. Vous pouvez maintenant supprimer Observer à un moment de votre choix.

2) Lorsque l'objet workplace est modifié, le mécanisme KVO "observera automatiquement" le nouveau address du nouveau workplace. Bien sûr, il vous informera du nouveau address.

Maintenant, vous pouvez observer le address sans craindre que le workplace soit remplacé au hasard. C'est l'un des vrais pouvoirs cachés du KVO. Cela permet aux sous-classes d'observer en toute sécurité les objets de n'importe quelle super-classe sans connaître leurs cycles de vie.

Modifier 1

Best practice to remove an object as observer for some KVO property

La réponse acceptée dans ce fil mieux décrit votre situation. Vous ne devriez pas avoir la propriété address en premier lieu, puisque vous n'avez aucun contrôle sur le cycle de vie workplace. Vous avez un problème de conception.

originale

Vous pouvez observer la KeyPath workplace sur l'objet personne. Lorsque ce keyPath est appelé, vous supprimez simplement Observer pour workplace.address.

[personne addObserver: forKeyPath The Observer: @ "lieu de travail" : les options [NSKeyValueObservingOptionNew] contexte: NULL];