Key-Value Observing (KVO) 是一个对象能够观察另外一个对象的属性的值,并且能够发现值的变化。
KVO的使用:
1.注册,指定被观察者的属性
被观察者发出 addObserver:forKeyPath:options:context:的方法来添加观察者
2.只要被观察者的keyPath值变化,就会在观察者里调用方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
注意:单纯改变其值不会调用此方法,只有通过getter和setter来改变值才会触发KVO
3.实现回调方法
观察者需要通过实现这个方法来对KVO发出的通知做出响应。
这些代码都只需要在观察里进行实现,被观察者不用添加任何代码,所以谁要监听谁注册,然后对响应进行处理即可,使得观察者与被观察者完全解耦,运用很灵活,很简便。
KVO的优缺点:
优点:
- 能够提供一种简单的方法实现两个对象间的同步,例如:model和view之间的同步
- 能够对不是我们创建的对象,即内部对象的状态改变作出响应,而且不需要改变内部对象(SKD对象)的实现
- 能够提供观察的属性的最新值以及先前值
- 用keyPaths来观察属性,因此也可以观察嵌套对象
- kvo中监测的对象可以是不存在的 为了防止意外崩溃
- 完成了对观察对象的抽象,因为不需要额外的代码来允许观察值能够被观察
缺点:
- 我们观察的属性必须使用NSString来定义,属性名通过NSString来查找的时候,编译器不会帮你检错和补全,纯手敲比较容易出错
- KVO只能监测类中的属性,即只能用来对属性做出反应,而不会用来对方法或者动作出反应
- 对属性重构将导致我们的观察代码不再可用
KVO与通知和代理的比较:
通知和代理模式适合一个controller与任何其他的对象进行通信,而kvo更加适合任何类型的对象侦听另外一个任意对象的改变。这是一个对象与另外一个对象保持同步的一种方法,即当另外一种对象的状态发生改变时,观察对象马上做出反应。