KVO和KVC简介
一、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 依赖键+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key + (NSSet *)keyPathsForValuesAffecting<Key> 例如,information 属性依赖于 target 的 age 和 grade 属性,target 的 age/grade 属性任一发生变化,information 的观察者都会得到通知。
+ (NSSet *)keyPathsForValuesAffectingInformation { NSSet * keyPaths = [NSSet setWithObjects:@"target.age", @"target.grade", nil]; return keyPaths; } + (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key { NSSet * keyPaths = [super keyPathsForValuesAffectingValueForKey:key]; NSArray * moreKeyPaths = nil; if ([key isEqualToString:@"information"]) { moreKeyPaths = [NSArray arrayWithObjects:@"target.age", @"target.grade", nil]; } if (moreKeyPaths) { keyPaths = [keyPaths setByAddingObjectsFromArray:moreKeyPaths]; } return keyPaths; } 要实现 keyPathsForValuesAffectingInformation 或 keyPathsForValuesAffectingValueForKey: 方法是告诉系统 information 属性依赖于哪些其他属性,这两个方法都返回一个key-path 的集合。
四、Key-Value-Coding--KVC(键值编码)(1)该机制会把类的属性作为一个key处理。(2)取值:[object valueForKey:@"key"]; 设值:[object setValue:@"value" forKey:@"key"];(3)KVO是基于KVC实现的。
二、KVO的通知触发方式:(1)在观察者类中实现+ automaticallyNotifiesObserversForKey:方法,当返回YES时,该key会在值发生改变时自动触发通知,如果返回NO,需要手动触发通知,在值改变前后加如下方法:– willChangeValueForKey: – didChangeValueForKey:(2)是自动还是手动,根据实际情况定,默认是自动的。(3)当直接赋值时,要加上对象,如当前对象的属性改变时要加self,否则不触发通知,需要手动触发。
三、KVO 依赖键
有时候一个属性的值依赖于其他属性值,那么如果其他属性值发生变更,那么必然也就导致该属性值的变更,也即 Dependent Poroperties。在KVO中,引入了依赖键
在KVO中,提供了如下两种实现 依赖键 的方法:
[cpp] view plain copy[cpp] view plain copy
如果选择实现 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实现的。
总结
- 上一篇: web处理高并发措施
- 下一篇: ajax delete 传递参数,spr