Utilisation du KVO

samirsamir Membre
février 2015 modifié dans API UIKit #1

Salut Tout le monde,


 


Je me pose des questions si je fais bien les choses ou pas :). Mon problème est le suivant :


 


J'ai un objet model :



@interface Account : NSObject
@property (nonatomic, assign) BOOL active;
@end

J'ai un contrôleur qui affiche un compte :



@interface AccountVC : UIViewController
- (instancetype)initWithAccount:(Account *)account;
@end

Et dans le .m :



@interface AccountVC()
@property(nonatomic, strong) Account *account;
@end

@implementation AccountVC 

- (instancetype)initWithAccount:(Account *)account {
self = [super init]
 if (!self) return nil; 
_account = account;
[_account addObserver:self forKeyPath:@active option:NSKeyValueObservingOptionNew context:NULL];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqual:@active]) {
        self.account.active = [[change objectForKey:NSKeyValueChangeNewKey] boolValue];
    }
}
@end

- (void)dealloc {
    [self.account removeObserver:self forKeyPath:@active];
}

Le problème ace ce code, c'est que je vais boucler infiniment sur la property active. 


 


J'ai plusieurs solutions pour ça, l'une est au moment de l'observation de la valeur ( dans la méthode observeValue...) je crée un nouveau objet Account, je supprime l'observation sur l'ancien objet et je rajoute une observation sur le nouveau objet Account.  Je trouve que cette solution n'est pas bonne.


 


Mes questions :


 


Est-ce que le bon pattern que j'utilise (KVO) ? si non, comment vous faites pour se tenir au courant des changements d'un objet model que vous passez de bout en bout. ?


 


Si c'est le KVO est le bon pattern, comment vous l'aurez utilisé ? 


 


Merci pour vos réponses.


 


Samir

Réponses

  • KVO est le bon pattern pour être informé du changement de propriété d'un objet.


     


    Mais je ne comprends pas ce que tu fais. Tu utilises ce pattern (qui permet d'être informé) pour modifier la même propriété du même objet (celle qui vient d'être modifiée donc). Donc oui ça va boucler indéfiniment (plus précisément jusqu'à  saturation de la pile).


  • Hello,


     


    Et oui j'ai fait n'importe quoi :). J'ai eu ce problème parce que je n'utilisait pas d'objet Account au début mais je travaillais sur un boolean...


     


    En fait j'ai même pas besoin de KVO dans mon cas.


     


    Merci jpimbert.


  • AliGatorAliGator Membre, Modérateur
    Alors oui effectivement dans ce cas le KVO n'est pas adapté, et tu peux l'enlever complètement (car là  pour l'instant ça disait "si la propriété "active" de mon Account change, alors affecter la propriété active de mon Account à  la valeur de la propriété active de mon Account"... heu effectivement, le serpent se mord la queue... pour rien en plus !

    Mais sinon, remarque importante sur ton implémentation de ton "initWithAccount:", tu as oublié de retourner "self". Tu dois même certainement avoir un warning à  ce sujet. Si tu laisses ton init ainsi, crash violents (genre EXC_BADACCESS) en perspective !
Connectez-vous ou Inscrivez-vous pour répondre.