KVO 是 Objective-C 对观察者设计模式的一种实现,依赖于 Objective-C 强大的 Runtime。
KVO提供一种机制 指定一个被观察对象的某个属性,当这个属性发生变化时,KVO回调方法就会被触发。
- 注意点
观察者观察的是属性,只有遵循 KVO 变更属性值的方式才会执行 KVO 的回调方法,例如是否执行了 setter 方法、或者是否使用了 KVC 赋值。
如果赋值没有通过 setter 方法或者 KVC,而是直接修改属性对应的成员变量,例如:仅调用 _name = @"newName",这时是不会触发 KVO 机制,更加不会调用回调方法的。
所以使用 KVO 机制的前提是遵循 KVO 的属性设置方式来变更属性值。
KVO用法
- 建立监听
- 处理监听
- 移除监听
建立监听
//第一个参数 observer:被观察对象
//第二个参数 keyPath: 被观察的属性名称
//第三个参数 options: 观察属性的新值、旧值等的一些配置(枚举)
//第四个参数 context:回调方法传值
[self addObserver:(nonnull NSObject *) forKeyPath:(nonnull NSString *) options:(NSKeyValueObservingOptions) context:(nullable void *)];
处理监听
//keyPath:被观察对象属性名称
//object:被观察的对象
//change:变化前后的值都存储在 change 字典中
//context:建立监听时,context 传过来的值
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
}
移除监听
//需要移除的被观察对象
// 需要移除的被观察属性
// context: 建立监听时的上下文
[self removeObserver:(nonnull NSObject *) forKeyPath:(nonnull NSString *) context:(nullable void *)];