Question

Dois-je pouvoir configurer un observateur sur un objet proxy, modifier ce que l'objet proxy pointe et être en mesure d'observer des changements sur l'objet réel?

Un exemple pourrait expliquer cela le mieux. Considérer ce qui suit.

Dans l'en-tête:

@interface MyController : NSObject {   

  MyWidgetModel * aProxyObject;

}

Dans une initialisation ou éveillée de la méthode de la plume:

-(void)awakeFromNib {

 // Init the proxy object. Could be as an empty widget 

 [aProxyObject addObserver:self 
                forKeyPath:@"widgetName"
                   options:NSKeyValueObservingOptionNew 
                   context:nil];

}

Une autre méthode qui modifie l'objet:

-(void)changeWidget:(MyWidgetModel *)aNewWidget {

  aProxyObject = aNewWidget;

}

Cela ne tire aucun changement dans aNewWidget. Cependant, si je déplace le addObserver à après l'affectation comme suit, cela fonctionne:

-(void)changeWidget:(MyWidgetModel *)aNewWidget {

   [aProxyObject removeObserver:self forKeyPath:@"widgetName"];

   aProxyObject = aNewWidget;

   [aProxyObject addObserver:self 
                  forKeyPath:@"widgetName"
                     options:NSKeyValueObservingOptionNew 
                     context:nil];
}

Je suppose que le premier cas ne fonctionne pas, c'est parce que l'observateur observe le pointeur de mémoire de la référence de l'objet proxy et, car il n'y a pas d'objet au moment où l'observateur proxy est ajouté n'a rien à observer. Cependant, si j'initive un widget et que l'observe, affectez l'objet proxy aNewWidget Il n'observe toujours pas de modifications à moins d'ajouter l'observateur après l'affectation (et bien sûr de créer un besoin de supprimer l'observateur sur un changement d'objet).

Aussi, que se passe-t-il dans ce scénario si aNewWidget est détruit? Parce que l'observateur est sur le proxy, cela annule-t-il la nécessité de supprimer l'observateur avant de détruire l'objet? (Je suppose que non).

Idéalement, j'aimerais pouvoir mettre l'observateur sur le proxy et échanger dans et sortir la référence du widget que je veux à l'objet proxy sans avoir à se soucier d'ajouter et de retirer l'observateur à moins que le MyController La classe disparaît auquel cas je pouvais gérer le retrait de l'observateur dans le Dealloc.

Toute aide / commentaires / conseils appréciés.

Était-ce utile?

La solution

La trajectoire doit être conforme au KVC. Voici donc le code:

@interface MyController : NSObject {   
  MyWidgetModel * aProxyObject;
}
@property (nonatomic, retain) MyWidgetModel * aProxyObject;

N'oubliez pas de le synthétiser dans le fichier d'implémentation. Utilisez ensuite ce code pour ajouter l'observateur:

[self addObserver:self 
            forKeyPath:@"aProxyObject"
               options:NSKeyValueObservingOptionNew 
               context:nil];

Veuillez vérifier mon montage. J'ai changé l'attribution pour conserver. Peut-être que c'est mieux pour vous. Vous devriez essayer de choisir le meilleur pour vous. Je veux juste dire que cela n'a pas d'importance dans KVO.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top