KVO

 

APP开发技术QQ群:347072638

一,概述

KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

二,使用方法

系统框架已经支持KVO,所以程序员在使用的时候非常简单。

1. 注册,指定被观察者的属性,

2. 实现回调方法

3. 移除观察

三,实例:

假设一个场景,股票的价格显示在当前屏幕上,当股票价格更改的时候,实时显示更新其价格。

1.定义DataModel,

  1. @interface StockData : NSObject {
  2. NSString * stockName;
  3. float price;
  4. }
  5. @end
  6. @implementation StockData
  7. @end

2.定义此model为Controller的属性,实例化它,监听它的属性,并显示在当前的View里边

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. stockForKVO = [[StockData alloc] init];
  5. [stockForKVO setValue:@"searph" forKey:@"stockName"];
  6. [stockForKVO setValue:@"10.0" forKey:@"price"];
  7. [stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
  8. myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];
  9. myLabel.textColor = [UIColor redColor];
  10. myLabel.text = [stockForKVO valueForKey:@"price"];
  11. [self.view addSubview:myLabel];
  12. UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  13. b.frame = CGRectMake(0, 0, 100, 30);
  14. [b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
  15. [self.view addSubview:b];
  16. }

3.当点击button的时候,调用buttonAction方法,修改对象的属性

  1. -(void) buttonAction
  2. {
  3. [stockForKVO setValue:@"20.0" forKey:@"price"];
  4. }

4. 实现回调方法

  1. -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
  2. {
  3. if([keyPath isEqualToString:@"price"])
  4. {
  5. myLabel.text = [stockForKVO valueForKey:@"price"];
  6. }
  7. }

5.增加观察与取消观察是成对出现的,所以需要在最后的时候,移除观察者

  1. - (void)dealloc
  2. {
  3. [super dealloc];
  4. [stockForKVO removeObserver:self forKeyPath:@"price"];
  5. [stockForKVO release];
  6. }

四,小结

KVO这种编码方式使用起来很简单,很适用与datamodel修改后,引发的UIVIew的变化这种情况,就像上边的例子那样,当更改属性的值后,监听对象会立即得到通知。

KVC

一,概述

KVC是KeyValueCoding的简称,它是一种可以直接通过字符串的名字(key)来访问类属性(实例变量)的机制。而不是通过调用Setter、Getter方法访问。

当使用KVO、Core Data、CocoaBindings、AppleScript(Mac支持)时,KVC是关键技术。

二,使用方法

关键方法定义在:NSKeyValueCodingprotocol

KVC支持类对象和内建基本数据类型。

获取值

valueForKey:,传入NSString属性的名字。

valueForKeyPath:,传入NSString属性的路径,xx.xx形式。

valueForUndefinedKey它的默认实现是抛出异常,可以重写这个函数做错误处理。

 修改值

setValue:forKey:

setValue:forKeyPath:

setValue:forUndefinedKey:

setNilValueForKey:当对非类对象属性设置nil时,调用,默认抛出异常。

一对多关系成员的情况

mutableArrayValueForKey:有序一对多关系成员  NSArray

mutableSetValueForKey:无序一对多关系成员  NSSet

三,实例:

1.    1 .Person类

2.    @implementation Person

3.    @synthesize name,age;//属性name 将被监视

4.    -(void) changeName

5.    {

6.        name=@"changeName directly";

7.    }

8.    @end

9.

10.

11. 2.PersonMonitor类  监视了name属性

12. @implementation PersonMonitor

13.

14. - (void)observeValueForKeyPath:(NSString *)keyPath

15.                       ofObject:(id)object

16.                         change:(NSDictionary *)change

17.                        context:(void *)context

18. {

19.     if ([keyPath isEqual:@"name"])

20.     {

21.         NSLog(@"change happen, old:%@   new:%@",[change objectForKey:NSKeyValueChangeOldKey],[change objectForKey:NSKeyValueChangeNewKey]);

22.     }

23. }

24. @end

25.

26.

27. 3测试代码

28.

29.    //初始化被监视对象

30.     Person *p =[[Person alloc] init];

31.    //监视对象

32.    PersonMonitor *pm= [[PersonMonitor alloc]init];

33.     [p addObserver:pm forKeyPath:@"name" options:(NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld) context:nil];

34.

35. //测试前的数据

36.     NSLog(@"p.name is %@",p.name);

37.

38. //通过setvalue 的方法,PersonMonitor的监视将被调用

39.   [p setValue:@"name kvc" forKey:@"name"];

40.

41. //查看设置后的值

42.    NSLog(@"p name get by kvc is %@",[p valueForKey:@"name"]);

43.

44. //效果和通过setValue 是一致的

45. p.name=@"name change by .name=";

46.

47.  //通过person自己的函数来更改name

48.      [p changeName];

49.

50.  结果是

51. 输出

52. 2011-07-03 16:35:57.406 Cocoa[13970:903] p.name is name

53. 2011-07-03 16:35:57.418 Cocoa[13970:903] change happen, old:name   new:name kvc

54. 2011-07-03 16:35:57.420 Cocoa[13970:903] p name get by kvc is name kvc

55. 2011-07-03 16:35:57.421 Cocoa[13970:903] change happen, old:name kvc   new:name change by .name=

56. 最后一次修改是直接修改  所以没法产生通知

四,小结

KVO/KVC这种编码方式使用起来很简单,很适用与datamodel修改后,引发的UIVIew的变化这种情况,就像上边的例子那样,当更改属性的值后,监听对象会立即得到通知。



iOS:KVO/KVC 的概述与使用的更多相关文章

  1. iOS KVO & KVC

    键值观察:值更改时通知观察者 键值观察(Key-value observing,或简称 KVO)允许对象观察另一个对象的属性.该属性值改变时,会通知观察对象.它了解新值以及旧值:如果观察的属性为对多的 ...

  2. 【转】 iOS KVO KVC

    原文: http://www.cocoachina.com/industry/20140224/7866.html Key Value Coding Key Value Coding是cocoa的一个 ...

  3. iOS KVO概述

    iOS KVO概述 面试中经常会被问到:什么是KVO?这个问题既然出现概率这么大,那么我们就来详细讲一讲到底什么是KVO.下次再有面试官问你的时候,你就可以娓娓道来,以彰显高逼格 概述 问:什么是KV ...

  4. 【iOS】KVC 与 KVO

    一.KVC与KVO *"KVC":key value Coding(键值编码) *目的:间接的改动或获取对象的属性,减少程序(类与类)之间的耦合度. *"KVO" ...

  5. IOS之KVC和KVO(未完待续)

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  6. KVO/KVC总结

    KVO/KVC总结       下面是根据网上文章的总结,方便查看. 在网上看别人的文章,了解KVC.KVO,有个kvo-kvc的例子,就是改变数组的内容(插入和删除),同步改变tableview中的 ...

  7. [BS-25] IOS中手势UIGestureRecognizer概述

    IOS中手势UIGestureRecognizer概述 一.概述 iPhone中处理触摸屏的操作,在3.2之前是主要使用的是由UIResponder而来的如下4种方式: - (void)touches ...

  8. iOS kvo 结合 FBKVOController 的使用

    iOS kvo 结合 FBKVOController 的使用 一:FBKVOControlloer是FaceBook开源的一个 在 iOS,maxOS上使用 kvo的 开源库: 提供了block和@s ...

  9. 【原】iOS中KVC和KVO的区别

    在iOS开发中经常会看到KVC和KVO这两个概念,比较可能混淆,特地区分一下 KVC(Key Value Coding) 1> 概述 KVC:Key Value Coding,键值编码,是一种间 ...

随机推荐

  1. postgresql数据库的数据导出

    一.pg_dump的用法:数据库的导入导出是最常用的功能之一,每种数据库都提供有这方面的工具,例如Oracle的exp/imp,Informix的dbexp/dbimp,MySQL的mysqldump ...

  2. mac 别名 ll

    在 Linux 下习惯使用 ll.la.l 等ls别名的童鞋到 mac os 可就郁闷了~~ 其实只要在用户目录下建立一个脚本“.bash_profile”, vim .bash_profile 并输 ...

  3. 【Android - 框架】之Glide的使用

    一.Glide简介: Glide是Google官方推荐的一个图片加载和缓存的开源库,它不仅能实现平滑的图片列表滚动效果,还支持远程图片的获取.大小调整和展示,并且可以加载GIF图片.Glide相比与U ...

  4. SwipeListView 具体解释 实现微信,QQ等滑动删除效果

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/28508769 今天看别人项目,看到别人使用了SwipeListView,Goog ...

  5. All About JAVA Maven的安装

    一转眼几个月过去了..真是忙碌的几个月,最近在弄CAS 身份认证系统,新版本的CAS需要使用Maven进行构建,所以还要研究下Maven相关的资料.第一步就是下载安装Maven.根据官方网站的文档很容 ...

  6. Oracle 学习笔记 11 -- 视图 (VIEW)

    本次必须学习一个全新的概念-- 视图 (VIEW).在前面的笔记中曾提到过,数据对象包含:表.视图.序列.索引和同义词.前面的笔记都是对表的想剖析,那么本次笔记就对视图的世界进行深入的剖析. 视图是通 ...

  7. strstr和memcmp函数的实现

    #include <stdio.h> #include <stdlib.h> //malloc()函数 typedef unsigned int size_t; size_t ...

  8. linux进程调度之 FIFO 和 RR 调度策略---SYSTEMTAP

    http://blog.chinaunix.net/uid-24774106-id-3379478.html http://blog.chinaunix.net/uid-24774106-id-337 ...

  9. [转] 学习React Native必看的几个开源项目

    http://www.lcode.org/study-react-native-opensource-one/ http://gold.xitu.io/entry/575f498c128fe10057 ...

  10. css 权威指南笔记(一)

    零零散散接触css将近5年,俨然已经成为一个熟练工.如果不是换份工作,我不知道自己差的那么远:在qunar的转正review中我这种“知其然而不知其所以然” 的状况被标明,我才意识到我已停步不前近两年 ...