KVO
KVO使用观察者模式,监听指定的属性的变化。通常用于model层和controller层之间,view层通过controller层来监听model的变化。
如果有两个类BankObject, PersonObject. PersonObject的实例希望监听BankObject类的accountBalance属性

先通过addObserver:forKeyPath:options:context:方法把PersonObject实例注册为BankObject的accountBalance的观察者。这个方法只能在类的实例之间建立关联关系,而不是对类建立关联关系。
被监听的对象的值修改以后,orginal value和new value都被保存到一个change dictionary中。可以给options传递这些选项:
NSKeyValueObservingOptionOld: 把change dictionary中的orginal value 传给观察者
NSKeyValueObservingOptionNew: 把change dictionary中的new value 传给观察者
NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew: 把orginal value和new value 都传给观察者
context 是一个指针,可以用来传给观察者一些参数。
addObserver:forKeyPath:options:context: 不会对被监听的对象,观察者和context保持强引用,必要的时候需要自己保证对这些对象的强引用

然后在PersonObject中实现observeValueForKeyPath:ofObject:change:context:方法对监听的属性进行响应。如果BankObject的accountBalance属性变化了,observeValueForKeyPath:ofObject:change:context:会被自动调用
change 参数是dictionary类型的,包含以下key:
NSKeyValueChangeKindKey: 如果被监听的属性被修改了,这个key对应的value为NSKeyValueChangeSetting
如果属性是一对多的关系,那么该key的value也可能是NSKeyValueChangeInsertion, NSKeyValueChangeRemoval, NSKeyValueChangeReplacement, NSKeyValueChangeIndexesKey
NSKeyValueChangeOldKey: old value
NSKeyValueChangeNewKey: new value
如果被监听的属性是scalar或者struct类型的,那么value会被包装成NSValue类型的

removeObserver:forKeyPath: 用来删除一个观察者

浙公网安备 33010602011771号