我是否能够在代理对象上设置观察者,更改代理对象指向的内容并仍能观察到真实对象的变化?
一个例子可以解释这一点。请考虑以下事项。
在标题中:
@interface MyController : NSObject {
MyWidgetModel * aProxyObject;
}
在NIB方法的初始化或唤醒中:
-(void)awakeFromNib {
// Init the proxy object. Could be as an empty widget
[aProxyObject addObserver:self
forKeyPath:@"widgetName"
options:NSKeyValueObservingOptionNew
context:nil];
}
更改对象的其他一些方法:
-(void)changeWidget:(MyWidgetModel *)aNewWidget {
aProxyObject = aNewWidget;
}
这不会触发aNewWidget
中的任何更改。但是,如果我按照以下方式将addObserver
移动到作业之后,则可以:
-(void)changeWidget:(MyWidgetModel *)aNewWidget {
[aProxyObject removeObserver:self forKeyPath:@"widgetName"];
aProxyObject = aNewWidget;
[aProxyObject addObserver:self
forKeyPath:@"widgetName"
options:NSKeyValueObservingOptionNew
context:nil];
}
我假设第一种情况不起作用是因为观察者正在观察代理对象引用的内存指针,并且由于当时没有添加代理观察者的对象没有什么可观察的。但是,如果我初始化一个小部件并观察它,那么分配代理对象aNewWidget
它仍然不会观察到更改,除非我在赋值后添加观察者(当然还需要在更改时删除观察者)对象)。
此外,如果aNewWidget
被销毁,在这种情况下会发生什么?因为观察者在代理上,这是否否定了在销毁对象之前移除观察者的需要? (我假设没有)。
理想情况下,我希望能够在代理上设置观察者并交换进出代理对象的任何小部件引用,而不必担心添加和删除观察者,除非MyController
类消失了,在这种情况下我可以处理dealloc中的观察者移除。
任何帮助/意见/建议表示赞赏。
答案 0 :(得分:0)
keyPath必须符合KVC标准。所以这是代码:
@interface MyController : NSObject {
MyWidgetModel * aProxyObject;
}
@property (nonatomic, retain) MyWidgetModel * aProxyObject;
不要忘记在实现文件中合成它。然后使用此代码添加观察者:
[self addObserver:self
forKeyPath:@"aProxyObject"
options:NSKeyValueObservingOptionNew
context:nil];
请检查我的编辑。我已将分配更改为保留。也许对你来说更好。你应该尽量选择最适合你的。我只想说在KVO中没关系。