一. 名词解释
KVO(key-Value Observing),键值编码。通过对目标对象的属性进行观察,当属性值发生变化时,触发观察者对象实现的KVO接口方法来自动通知观察者。简单的说,就是一个对象可以通过KVC监听另外一个对象的状态变化。KVO是基于KVC实现的
二 .KVO使用
- 使用系统提供的KVO方法添加和移除KVO。
以下是系统提供的观察者的三个方法:
@observer:观察者,也就是KVO通知的订阅者。订阅者必须实现
observeValueForKeyPath:ofObject:change:context:方法
@keyPath:描述将要观察的属性,相对于被观察者。
@options:KVO的一些属性配置;有四个选项:NSKeyValueObservingOptionNew:change字典包括改变后的值
NSKeyValueObservingOptionOld:change字典包括改变前的值
NSKeyValueObservingOptionInitial:注册后立刻触发KVO通知
NSKeyValueObservingOptionPrior:值改变前是否也要通知(这个key决定了是否在改变前改变后通知两次)
@context: 上下文,这个会传递到订阅者的函数中,用来区分消息,所以应当是不同的。
@change:这个字典保存了变更信息,具体是哪些信息取决于注册时的 NSKeyValueObservingOptions。
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;//添加观察者
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;//移除观察者(注意:在不用的时候,不要忘记解除注册,否则会导致内存泄露。)
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;//观察者默认执行的回调
- 手动KVO。手动KVO的好处就是可以加上自己的判断条件。
首先,需要手动实现属性的 setter 方法,并在设置操作的前后分别调用 willChangeValueForKey: 和 didChangeValueForKey方法,这两个方法用于通知系统该 key 的属性值即将和已经变更了;
其次,要实现类方法 automaticallyNotifiesObserversForKey,并在其中设置对该 key 不自动发送通知(返回 NO 即可)。这里要注意,对其它非手动实现的 key,要转交给 super 来处理。 - 禁用KVO
直接automaticallyNotifiesObserversForKey返回NO,实现属性的 setter 方法,不进行调用willChangeValueForKey: 和 didChangeValueForKey方法。