一、Key-Value-Observing--KVO(键值观察者模式)
(1)简介:
此机制可以在一个类中监听另外一个类的属性变化,包括我们自己的类和已有的Cocoa类库中的类。当被监听的类的属性发生了变化时,观察者会收到通知,可以针对属性变化添加自己的动作。
(2)为被监听对象注册观察者:指定观察者,要观察的属性的名称,options可以传0值。
– addObserver:forKeyPath:options:context:
(3)观察者实现通知接收函数:
– observeValueForKeyPath:ofObject:change:context:
(4)在不需要观察者或者观察者销毁前移除观察者:
– removeObserver:forKeyPath:context:
(5)当被监听的对象的对应key值发生更改时,观察者会收到通知,比如给属性直接赋值,后者调用-setValue:forKey:方法。
二、KVO的通知触发方式:
(1)在观察者类中实现+ automaticallyNotifiesObserversForKey:方法,当返回YES时,该key会在值发生改变时自动触发通知,如果返回NO,需要手动触发通知,在值改变前后加如下方法:– willChangeValueForKey: – didChangeValueForKey:
(2)是自动还是手动,根据实际情况定,默认是自动的。
(3)当直接赋值时,要加上对象,如当前对象的属性改变时要加self,否则不触发通知,需要手动触发。
三、KVO 依赖键
有时候一个属性的值依赖于其他属性值,那么如果其他属性值发生变更,那么必然也就导致该属性值的变更,也即 Dependent Poroperties。在KVO中,引入了依赖键
在KVO中,提供了如下两种实现 依赖键 的方法:
例如,information 属性依赖于 target 的 age 和 grade 属性,target 的 age/grade 属性任一发生变化,information 的观察者都会得到通知。要实现 keyPathsForValuesAffectingInformation 或 keyPathsForValuesAffectingValueForKey: 方法是告诉系统 information 属性依赖于哪些其他属性,这两个方法都返回一个key-path 的集合。
如果选择实现 keyPathsForValuesAffectingValueForKey,要先获取 super 返回的结果 set,然后判断 key 是不是目标 key,如果是就将依赖属性的 key-path 结合追加到 super 返回的结果 set 中,否则直接返回 super的结果。
注:显然前者实现过程简单。
四、Key-Value-Coding--KVC(键值编码)
(1)该机制会把类的属性作为一个key处理。
(2)取值:[object valueForKey:@"key"];
设值:[object setValue:@"value" forKey:@"key"];
(3)KVO是基于KVC实现的。