Key-Value Observing (简写为KVO):当指定的对象的属性被修改了,允许对象接受到通知的机制。每次指定的被观察对象的属性被修改的时候,KVO都会自动的去通知相应的观察者。
KVO优点:
1) 每次属性改变了就发送消息通知 。KVO对资源消耗比较底。(有改变就通知观察者)
2) KVO非常的强大,可以很容易的支持多个观察者观察同一个属性,以及相关的值
KVO使用:
1)首先,构思一下如下实现KVO是否有必要。比如,一个对象,当另一个对象的特定属性改变的时候,需要被通知到。
2)被观察对象的值(属性)加入“addObserver:forKeyPath:options:context:”观察。(当一个对象的特定属性改变的时候,需要被通知到另一个对象)
[self.tableViewaddObserver:self forKeyPath:@"contentOffset"options:NSKeyValueObservingOptionNewcontext: nil];当tableView的contentOffset属性发生变化时self会得到通知(即 observeValueForKeyPath:ofObject: change: context:方法会被调用)
3) 实现回调。
监听属性值发生改变时 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 会被调用,在方法里我们可以做出应对的变化。
4)移除观察
当我们不在需要观察变化时,应当移除所观察。
即对应的 [self.tableViewremoveObserver:selfforKeyPath:@"contentOffset"];
其实在KVO里已经有对KVC的应用,forKeyPath:@"contentOffset",应该就是对KVC的应用。
对比Notification 和 KVO
相同
Notification 和 KVO都是用于协助对象间的通信:某个对象监听某个事件的发生,当某个事件发生时,该对象会得到通知然后做出响应;
相异
Notification 中监听者向一个单例对象NSNotificationCenter注册,NSNotificationCenter类似一个广播中心,接受任何对象的注册且不一定指望有谁对此消息关心,(可以一对多);KVC则向要监听的对象注册,监听者必须知道发送者(值将发生改变的那个对象) 一对一。
NSNotification模式里监听的对象与被监听的对象通信是通过 NSNotificationCenter 这个中介,而KVO 里,不能说两者是直接通信的,我没有了解过过 KVO 是如何实现通信的,从表面上看两者就那么心灵感应一般(很高大上),这是系统替我们实现的;
示例二(来自《iOS7编程实战》)