pb avec les "observer"
AlfAlf
Membre
Bonjour,
j'ai defini une classe qui contient 5 valeurs : a, b, c, d et e. Je veux calculer e = (a+b)*c.
Pour ça je definis d = a+b, et pour que "d" se mette à jour tout seul j'utilise
[self setKeys:[NSArray arrayWithObjects:@a,@b,nil] triggerChangeNotificationsForDependentKey:@d];
puis pour que le resultat "e" se mette o jour tout seul j'utilise
[self setKeys:[NSArray arrayWithObjects:@d,@c,nil] triggerChangeNotificationsForDependentKey:@e];
Quand je teste mon code, j'obtiens un resultat etrange :
_ si je change "c", pas de pb, "e" se met a jour tout seul
_ si je change "a" ou "b" alors "e" ne se met pas à jour, mais si maintenant je change "c" alors "e" se met à jour en tenant compte des nouvelles valeurs de "a" et "b".
Si vous avez des idées pour expliquer pourquoi cela fonctionne comme ça, je suis prenneur.
PS: c'est etonnant qu'il n'y ait pas de fonction analogue pour "setKeyPath: triggerChangeNotificationsForDependentKeyPath" (j'ai essaye avec par exemple @properties.nom mais ça marche pas )
j'ai defini une classe qui contient 5 valeurs : a, b, c, d et e. Je veux calculer e = (a+b)*c.
Pour ça je definis d = a+b, et pour que "d" se mette à jour tout seul j'utilise
[self setKeys:[NSArray arrayWithObjects:@a,@b,nil] triggerChangeNotificationsForDependentKey:@d];
puis pour que le resultat "e" se mette o jour tout seul j'utilise
[self setKeys:[NSArray arrayWithObjects:@d,@c,nil] triggerChangeNotificationsForDependentKey:@e];
Quand je teste mon code, j'obtiens un resultat etrange :
_ si je change "c", pas de pb, "e" se met a jour tout seul
_ si je change "a" ou "b" alors "e" ne se met pas à jour, mais si maintenant je change "c" alors "e" se met à jour en tenant compte des nouvelles valeurs de "a" et "b".
Si vous avez des idées pour expliquer pourquoi cela fonctionne comme ça, je suis prenneur.
PS: c'est etonnant qu'il n'y ait pas de fonction analogue pour "setKeyPath: triggerChangeNotificationsForDependentKeyPath" (j'ai essaye avec par exemple @properties.nom mais ça marche pas )
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
As tu réellement besoin de la valeur de d (a+b) ?
Ne peux tu tout calculer en une seule passe? et utiliser alors:
Peut-être que lorsque "a" ou "b" sont modifiés, "d" est mis à jour en shuntant ses accesseurs KVC (setD) non ? ???
En effet j'utilise
-(double)d { return (a+b); }
mais je ne vois pas comment faire pour utiliser setD puis que la syntaxe dont j'ai l'habitude est plutôt
-(void)setD:(double)newD
{
if (d != newD)
{ d = newD; }
}
mais là "d" dépend de 2 valeurs alors je vois pas comment utiliser setD ?
Au pire tu n'as qu'à déclarer un accesseur setD bidon dont l'implémentation ne fait strictement rien et appeler ton setD chaque fois qu'un recalcul est effectué.
Le simple fait d'appeler setD, quand "a" ou "b" sont modifiés, devrait activer les observers qui pointent sur "d" et donc répercuter la modification sur "e" ... 8)
[EDIT] Oups CORRECTION:
En fait le setter setD marchera MAIS il ne faut pas l'utiliser dans ce cadre des "dependents-keys" où ton "d" N'EST PAS une "property" réelle avec un getter et un setter mais une sorte de "property d'affichage" par les bindings dont seul le getter est activé par l'U.I. quand une "dépendentKey" est modifiée.
La seule solution respectant la philosophie des clefs dépendantes consiste seulement à déclarer la dépendance pour l'affichage de "d" comme tu l'as fait MAIS AUSSI d'ajouter "a" et "b" aux clefs "d" et "c" de dépendance de "e".