【iOS】KVC 和 KVO 的使用场景
来源:互联网 发布:淘宝阿里旺旺买家版 编辑:程序博客网 时间:2024/05/18 00:21
- @interface People: NSObject
- @property (nonatomic, strong) NSString *name;
- @property (nonatomic, strong) NSNumber *age;
- @end
- - (id)tableView:(NSTableView *)tableview
- objectValueForTableColumn:(id)column row:(NSInteger)row {
- People *people = [peoleArray objectAtIndex:row];
- if ([[column identifier] isEqualToString:@"name"]) {
- return [people name];
- }
- if ([[column identifier] isEqualToString:@"age"]) {
- return [people age];
- }
- // And so on.
- }
- People *people = [peopleArray objectAtIndex:row];
- return [people valueForKey:[column identifier]];
- -(id) initWithDictionary:(NSMutableDictionary*) jsonObject
- {
- if((self = [super init]))
- {
- [self init];
- [self setValuesForKeysWithDictionary:jsonObject];
- }
- return self;
- }
- - (void)setValue:(id)value forUndefinedKey:(NSString *)key
- {
- if([key isEqualToString:@"nameXXX"])
- self.name = value;
- if([key isEqualToString:@"ageXXX"])
- self.age = value;
- else
- [super setValue:value forKey:key];
- }
- -(void) setValue:(id)value forKey:(NSString *)key
- {
- if([key isEqualToString:@"products"])
- {
- for(NSMutableDictionary *productDict in value)
- {
- Prodcut *product = [[Product alloc] initWithDictionary:prodcutDict];
- [self.products addObject:product];
- }
- }
- }
- [array valueForKeyPath:@"name.capitalizedString"]
- - (void)removeObservation {
- [self.object removeObserver:self
- forKeyPath:self.property];
- }
- - (void)addObservation {
- [self.object addObserver:self forKeyPath:self.property
- options:0
- context:(__bridge void*)self];
- }
- - (void)observeValueForKeyPath:(NSString *)keyPath
- ofObject:(id)object
- change:(NSDictionary *)change
- context:(void *)context {
- if ((__bridge id)context == self) {
- // 只处理跟我们当前class的property更新
- }
- else {
- [super observeValueForKeyPath:keyPath ofObject:object
- change:change context:context];
- }
- }
转自:http://www.cnblogs.com/scorpiozj/archive/2011/03/14/1983643.html
对kvo/kvc做了简单的介绍,可作为入门读物。
有些术语描述不够精确请指正。
欢迎讨论。
Kvo是Cocoa的一个重要机制,他提供了观察某一属性变化的方法,极大的简化了代码。这种观察-被观察模型适用于这样的情况,比方说根据A(数 据类)的某个属性值变化,B(view类)中的某个属性做出相应变化。对于推崇MVC的cocoa而言,kvo应用的地方非常广泛。(这样的机制听起来类 似Notification,但是notification是需要一个发送notification的对象,一般是 notificationCenter,来通知观察者。而kvo是直接通知到观察对象。)
适用kvo时,通常遵循如下流程:
1 注册:
keyPath就是要观察的属性值,options给你观察键值变化的选择,而context方便传输你需要的数据(注意这是一个void型)
2 实现变化方法:
change:(NSDictionary *)change context:(void*)context
change里存储了一些变化的数据,比如变化前的数据,变化后的数据;如果注册时context不为空,这里context就能接收到。
是不是很简单?kvo的逻辑非常清晰,实现步骤简单。
说了这么多,大家都要跃跃欲试了吧。可是,在此之前,我们还需要了解KVC机制。其实,知道了kvo的逻辑只是帮助你理解而已,要真正掌握的,不在 于kvo的实现步骤是什么,而在于KVC,因为只有符合KVC标准的对象才能使用kvo(强烈推荐要使用kvo的人先理解KVC)。
KVC是一种间接访问对象属性(用字符串表征)的机制,而不是直接调用对象的accessor方法或是直接访问成员对象。
key就是确定对象某个值的字符串,它通常和accessor方法或是变量同名,并且必须以小写字母开头。Key path就是以“.”分隔的key,因为属性值也能包含属性。比如我们可以person这样的key,也可以有key.gender这样的key path。
获取属性值时可以通过valueForKey:的方法,设置属性值用setValue:forKey:。与此同时,KVC还对未定义的属性值定义了 valueForUndefinedKey:,你可以重载以获取你要的实现(补充下,KVC定义载NSKeyValueCoding的非正式协议里)。
在O-C 2.0引入了property,我们也可以通过.运算符来访问属性。下面直接看个例子:
instance.number =3;
[instance setValue:[NSNumber numberWithInteger:3] forKey:@"number"];
注意KVC中的value都必须是对象。
以上介绍了通过KVC来获取/设置属性,接下来要说明下实现KVC的访问器方法(accessor method)。Apple给出的惯例通常是:
-key:,以及setKey:(使用的name convention和setter/getter命名一致)。对于未定义的属性可以用setNilValueForKey:。
至此,KVC的基本概念你应该已经掌握了。之所以是基本,因为只涉及到了单值情况,kvc还可以运用到对多关系,这里就不说了,留给各位自我学习的空间
接下来,我们要以集合为例,来对掌握的KVC进行一下实践。
之所以选择array,因为在ios中,array往往做为tableview的数据源,有这样的一种情况:
假设我们已经有N条数据,在进行了某个操作后,有在原先的数据后多了2条记录;或者对N中的某些数据进行更新替换。不使用KVC我们可以使用 reloadData方法或reloadRowsAtIndexPaths。前一种的弊端在于如果N很大消耗就很大。试想你只添加了几条数据却要重载之前 N数据。后一种方法的不足在于代码会很冗余,你要一次计算各个indexPath再去reload,而且还要提前想好究竟在哪些情况下会引起数据更新,
倘若使用了KVC/kvo,这样的麻烦就迎刃而解了,你将不用关心追加或是更新多少条数据。
下面将以添加数据为例,说明需要实现的方法:
实现insertObject:inKeyAtIndex:或者insertKey:atIndexes。同时在kvo中我们可以通过change这个dictionary得知发生了哪种变化,从而进行相应的处理。
另附关于KVC/KVO的资料:点击下载
新增加一个例子:点击下载
- 【iOS】KVC 和 KVO 的使用场景
- 【iOS】KVC 和 KVO 的使用场景
- 【iOS】KVC 和 KVO 的使用场景
- 【iOS】KVC 和 KVO 的使用场景
- 【iOS】KVC 和 KVO 的使用场景
- 【iOS】KVC 和 KVO 的使用场景
- KVC 和 KVO 的使用场景
- KVC 和 KVO 的使用场景
- iOS 中KVO和KVC的使用
- IOS开发 - KVC和KVO的使用
- IOS KVC和KVO的使用
- iOS KVC和KVO的使用
- ios KVC KVO的使用
- KVC 和KVO的使用
- KVC和KVO的使用
- iOS开发 kvc kvo 委托代理 协议 通知 简述 和使用场景
- iOS 中KVC、KVO使用和介绍
- ios kvc和kvo
- 2016年58同城赶集笔试题
- 自定义开关控件
- css3控制背景渐变
- uva 10615 - Rooks(完美匹配)
- 2014年各世代iPhone 屏幕尺寸与分辨率表格
- 【iOS】KVC 和 KVO 的使用场景
- 源码解析: Imread函数
- javascript学习笔记(1)初识
- ACM学习资源
- java面试题集锦(二)
- git使用笔记
- Android屏幕适配全攻略(最权威的官方适配指导)
- Android开发环境的离线安装方式(超易搭建秘籍)
- VS2008将原有的tab空格设置为空格符号