pb avec les "observer"

AlfAlfAlfAlf Membre
23:51 modifié dans API AppKit #1
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 ) :'(

Réponses

  • ClicCoolClicCool Membre
    23:51 modifié #2
    dans 1104588346:

    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


    As tu réellement besoin de la valeur de d (a+b) ?
    Ne peux tu tout calculer en une seule passe? et utiliser alors:
    [self setKeys:[NSArray arrayWithObjects:@"a",@"b",@"c"nil] triggerChangeNotificationsForDependentKey:@"e"];
    


    dans 1104588346:
    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.

    Peut-être que lorsque "a" ou "b"  sont modifiés, "d" est mis à  jour en shuntant ses accesseurs KVC (setD) non ? ???
  • AlfAlfAlfAlf Membre
    23:51 modifié #3
    J'ai effectivement besoin de calculer "d" (l'exemple que je prends est là  juste pour symboliser ce que je veux faire : c'est vrai qu'à  première vue ça peut paraà®tre un peu futil)

    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 ?
  • ClicCoolClicCool Membre
    janvier 2005 modifié #4
    Je suis pas certain d'avoir bien pigé la structure de tes appels mais que se passe-t-il donc quand "a" ou "b" sont modifiés ?

    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".
  • AlfAlfAlfAlf Membre
    23:51 modifié #5
    Merci effectivement maintenant ça marche parfaitement
Connectez-vous ou Inscrivez-vous pour répondre.