2010-09-27 21 views
0

Très souvent, je rencontre un scénario quand je veux observer les changements sur une propriété retenue:Existe-t-il une bonne façon de configurer KVO sur les propriétés conservées?

@interface AnObserver {…} 
@property(retain) Foo *foo; 

Maintenant, quand je veux mettre en place l'observation, je dois écrire mon propre compositeur, répétant tout le code setter boilerplate :

- (void) setFoo: (Foo*) newFoo { 
    if (newFoo == foo) 
     return; 
    [foo removeObserver:self forKeyPath:…]; 
    [foo release], foo = [newFoo retain]; 
    [foo addObserver:self forKeyPath:…]; 
} 

C'est stupide, car elle pollue la source avec le code et boilerplate il est facile de manquer quelque chose. Existe-t-il une meilleure façon de configurer le KVO sur les propriétés conservées? Je voudrais pouvoir écrire quelque chose comme Mooseafter crochet pour changer le KVO après que la propriété a été changée.

En fait, je compris que je pouvais regarder le bien immobilier:

[self addObserver:self forKeyPath:@"foo"…]; 

Et puis modifiez le KVO lorsque la propriété change :-), mais je réalise ce qui est beaucoup plus compliqué que le compositeur écrit à la main J'aimerais éviter.

Des idées?

Répondre

2

Comment utiliser un chemin de clé? Supposons que vous souhaitiez observer les modifications sur les propriétés value1 et value2 de foo. Vous pouvez utiliser:

[self addObserver:self forKeyPath:@"foo.value1"]; 
[self addObserver:self forKeyPath:@"foo.value2"]; 

Ensuite, lorsque ces propriétés changent, vous recevez des notifications.

+0

Cela semble fonctionner, merci! – zoul