KVO和KVC简介

来源:互联网 发布:大数据上市公司 编辑:程序博客网 时间:2024/06/05 15:01
一、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中,提供了如下两种实现 依赖键 的方法:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. + (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key    
  2.     
  3. + (NSSet *)keyPathsForValuesAffecting<Key>   
例如,information 属性依赖于 target 的 age 和 grade 属性,target 的 age/grade 属性任一发生变化,information 的观察者都会得到通知。

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. + (NSSet *)keyPathsForValuesAffectingInformation    
  2. {    
  3.     NSSet * keyPaths = [NSSet setWithObjects:@"target.age", @"target.grade", nil];    
  4.     return keyPaths;    
  5. }    
  6.     
  7. + (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key    
  8. {    
  9.     NSSet * keyPaths = [super keyPathsForValuesAffectingValueForKey:key];    
  10.     NSArray * moreKeyPaths = nil;    
  11.         
  12.     if ([key isEqualToString:@"information"])    
  13.     {    
  14.         moreKeyPaths = [NSArray arrayWithObjects:@"target.age", @"target.grade", nil];    
  15.     }    
  16.         
  17.     if (moreKeyPaths)    
  18.     {    
  19.         keyPaths = [keyPaths setByAddingObjectsFromArray:moreKeyPaths];    
  20.     }    
  21.         
  22.     return keyPaths;    
  23. }   
要实现 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实现的。
0 0
原创粉丝点击