cocoa 之 KVO

来源:互联网 发布:windows 远程桌面 打开 编辑:程序博客网 时间:2024/04/30 22:35

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编程实战》)


本文为个人理解,仅为自己以后检阅所用。如有错误,欢迎指出!


0 0
原创粉丝点击