Key-Value Observing 简称KVO ,键值观察,借助于KVC实现的观察者模式(设计模式)。一个观察者A观察B的属性,当B属性引起变化时,通知A做出相应的决策。下面简略介绍了一个personObject观察自己的银行中的账户余额属性,当账户余额发生变化时通知观察者做出相应决策
-----------------------------------------------具体实现--------------------------------
为了实现KVO 以下三个步奏缺一不可
1.被观察类的被观察属性必须满足KVO-Compliance
2.将观察者注册到被观察对象中,给被观察者发送addObserver:forKeyPath:options:context:消息
3.观察者必须实现observerValueForKeyPath:ofObject:change:context:方法。
(并不是所有类的所有属性都满足KVO-Compliance的,这个会在后面KVO Compliance这一节详细讨论。一般情况下,苹果提供的框架满足KVO-Compliance。)
1)注册观察者
- (void)registerAsObserver {
/*
Register 'inspector' to receive change notifications for the "openingBalance" property of
the 'account' object and specify that both the old and new values of "openingBalance"
should be provided in the observe… method.
*/
[account addObserver:inspector forKeyPath:@"openingBalance" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:NULL];
}
options 中的参数和observerValueForKeyPath:ofObject:change:context:中的change字典有关,如果提供NSKeyValueObservingOptionNew和NSKeyValueObservingOptionOld,则change字典中会提供属性值变化前和变化后的值。context参数可以是C指针也可以是对象的引用。在observerValueForKeyPath:ofObject:change:context:调用的时候context会可能被用到,主要是用来标记当前通知的上下文或者提供一些其他信息数据,几乎很少用一般为NULL。
2)接收变化通知
当被观察属性变化时,会调用观察者的如下方法:
其中change参数是一个字典,包含了注册时候提供的登记的键,例如NSKeyValueChangeOldKey, NSKeyValueChangeNewKey。如果被观察属性还是to-many relationship的类型,则NSKeyValueChangeInsertion, NSKeyValueChangeRemoval, NSKeyValueChangeReplacement表示当其内容有新增,移除,替换的变动信息。
3)移除观察者
网友评论