1. 是啥?
键值监听,一个对象(观察者)通过监听另一个对象(被观察者)属性值的变化,而据此作出反应的一种方法。常用于处理一对多的依赖关系。
2.怎么用?
观察者需要 注册观察者,指定被观察者及其属性、实现回调方法、移除监听;被观察者需要改变相应的属性值。
2.1 观察者 添加被观察者及其属性值
[self.userModel addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];//观察者(self)监听userModel的name属性,
2.2 观察者实现回调方法(系统方法 keyPath 监听的属性名 change 改变的值 context 用来区分不同的KVO)
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context;
2.3 移除监听(-dealloc方法中)
[self.userModel removeObserver:self forKeyPath:@"name" context:nil];
2.4 被监听者 改变对应属性的值
[self.userModel setValue:@"张三丰" forkey:@"name"];
3.什么时候用?
常用于处理Model和View层的解耦合,当Model的一个属性值改变了,监听这个属性的View要做对应的处理。
4.用的时候需要注意什么?
4.1 观察者只能监听被观察者的属性,而且属性是用字符串表示的,所以一旦写错,编译器不会检查;
4.2 对被观察的属性重构将导致我们观察代码不再可用;
4.3 可以提供观察的属性的最新值以及先前值;[change objectForKey:NSKeyValueChangeNewKey];//NSKeyValueChangeOldKey
4.4 注意:KVO的响应和观察的值变化是在一个线程上。
5.其他
5.1 基本上所有的代码都是在观察者的类里面写的,被观察者只需要改变他的被观察属性值就可以了。
5.2 在事件处理上,如果是属性层的事件,就用KVO; 其他事件用代理或block;模块不紧密或者以上实现困难的话再用通知(性能低)。