Utilisation du KVO
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.
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 !