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: 用来删除一个观察者

posted @ 2014-08-21 15:49  Super猪  阅读(210)  评论(0)    收藏  举报