addObserver:forKeyPath:options:context:各个参数的作用分别是什么?observer中需要实现哪个方法才能获得KVO回调?
observeValueForKeyPath:ofObject:change:context:各个参数的作用又分别是什么?
最后观察者如何清除?
注册观察者对象
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;
e.g: [deviceManager addObserver:logViewDisplay forKeyPath:@"logMessage" options:NSKeyValueObservingOptionNew context:nil];
/**
1) deviceManager为被观察者
1) logViewDisplay: 观察者对象.其必须实现方法observeValueForKeyPath:ofObject:change:context:.
2) logMessage: 被观察的属性,其不能为nil.
3) options: 设定通知观察者时传递的属性值,是传改变前的呢,还是改变后的,具体的设定可以这儿:
通知变化的具体值为:(NSKeyValueObservingOptionNew, NSKeyValueObservingOptionOld, 和NSKeyValueObservingOption
4) context: 一些其他的需要传递给观察者的上下文信息,通常设置为nil
*/
被观察者的响应
该方法由被观察者调用后必须在被观察者类中实现下面方法,完成对属性的响应
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
LogMessage *logMsg = [change objectForKey:@"new"];
[self showMessage:logMsg];
}
/**
* keyPath : 被观察的属性,其不能为nil
* object : 被观察者的对象
* change : 属性值,根据上面提到的Option设置,给出对应得属性值
* context : 上面传递的context对象
*/
取消观察者的注册
- (void)removeObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath
观察者还需要知道被观察对象的生命周期,因为在销毁发送者对象之前,需要取消观察者的注册。
网友评论