欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > c/c++ >内容正文

c/c++

KVO和KVC简介

发布时间:2024/7/23 c/c++ 83 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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 依赖键

有时候一个属性的值依赖于其他属性值,那么如果其他属性值发生变更,那么必然也就导致该属性值的变更,也即 Dependent Poroperties。在KVO中,引入了依赖键

在KVO中,提供了如下两种实现 依赖键 的方法:

[cpp] view plain copy 
  • + (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key    
  •     
  • + (NSSet *)keyPathsForValuesAffecting<Key>   
  • 例如,information 属性依赖于 target 的 age 和 grade 属性,target 的 age/grade 属性任一发生变化,information 的观察者都会得到通知。

    [cpp] view plain copy 
  • + (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 的集合。


    如果选择实现 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实现的。

    总结

    以上是生活随笔为你收集整理的KVO和KVC简介的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。