Objet d'observation à l'aide d'un objet proxy
-
29-10-2019 - |
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.
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.