KVO

一,概述

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

二,使用方法

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

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

2. 实现回调方法

3. 移除观察

三,实例:

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

1.定义DataModel,

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

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

[cpp] view plaincopy
  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方法,修改对象的属性

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

4. 实现回调方法

[cpp] view plaincopy
  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.增加观察与取消观察是成对出现的,所以需要在最后的时候,移除观察者

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

四,小结

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

KVC

利用KVC字典转模型实现原理:

遍历字典中的所有Key,去模型中查找有没有跟key相似的属性名。

  • 遍历出name这个key,去模型中查找有没有setName:方法,找到就直接调用,给模型的成员属性赋值。self.name = dict[@"name"];
  • 在去模型中查找有没有name这个属性名,如果找到,直接通过属性赋值 name = dict[@"name"];
  • 在去模型中查找有没有_name这个属性名,如果找到,直接通过属性赋值 _name = dict[@"name"];
  • 会直接报错。
    [dict enumerateKeyAndObjectsUsingBlock:^(id key,id obj,BOOL *stop){[class setValue:obj forKeyPath:key];
    }]

一,概述

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的变化这种情况,就像上边的例子那样,当更改属性的值后,监听对象会立即得到通知。

转载于:https://www.cnblogs.com/ShaoYinling/p/4576019.html

iOS:KVO/KVC 的概述与使用相关推荐

  1. [iOS]-KVO+KVC

    目录: 参考的博客: KVO 什么是KVO KVO的基本使用 KVO使用注意事项 手动调用KVO KVO本质 NSKVONotifying_Apple内部实现 setter的实现不同 KVO部分相关问 ...

  2. iOS KVO KVC

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

  3. iOS 中KVC、KVO、NSNotification、delegate 总结及区别

    iOS 中KVC.KVO.NSNotification.delegate 总结及区别 1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属 ...

  4. iOS KVO和KVC介绍

    iOS KVO和KVC介绍 KVO和KVC都是基于对NSObject的扩展来实现的,所有继承于NSObject的子类都能使用KVO和KVC. 用来测试的model: @interface User : ...

  5. 【iOS】KVC 与 KVO

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

  6. ios 通过kvc修改属性会触发kvo_iOS开发-KVC和KVO的理解

    KVC和KVO看起来很专业,其实用起来还是比较简单的,KVC(Key-value coding)可以理解为键值对编码,如果对象的基本类型,那么键值对编码实际上和get,set方法没有区别,如果是属性是 ...

  7. 【iOS】—— KVC与KVO

    KVC与KVO 一.KVC 1.简单介绍 2.常见的API 3.key和keyPath的区别 4.KVC原理 4.1 `setValue:forKey: `的原理(KVC赋值原理) 4.2 `valu ...

  8. iOS 之 KVC KVO

    KVC KVC的定义都是对NSObject的扩展来实现的,Objective-C中有个显式的NSKeyValueCoding类别名,所以对于所有继承了NSObject的类型,都能使用KVC(一些纯Sw ...

  9. 【iOS】--KVC与KVO

    键值编码(KVC)与键值监听(KVO) KVC(Key Value Coding)允许以字符串的形式间接操作对象的属性. 简单的KVC 最基本的KVC由NSKeyValueCoding协议提供支持,最 ...

  10. iOS KVO和KVC

    一.KVO全称key value observing,是苹果提供的一套事件通知机制,俗称键值监听. 1.注册观察者 /* @observer:就是观察者,是谁想要观测对象的值的改变. @keyPath ...

最新文章

  1. 手把手教你写移动端瀑布流控件布局篇
  2. .net 基元类型,引用类型和值类型
  3. Centos7.5 lnmp+mongodb扩展
  4. 第一章 Linux是什么
  5. 都9012了,这几个公众号你还没关注?
  6. ajax修改属性后如何遍历,Ajax遍历jSon后对每一条数据进行相应的修改和删除(代码分享)...
  7. HTTP协议基本原理简介(一)
  8. 应用机器学习(七):随机森林
  9. 设置jupyter notebook软件的字体样式
  10. 转:五大常用算法——贪心算法详解及经典例子
  11. 上海大华条码称代码_上海大华条码秤简易说明书
  12. HTML基础常识问答(四)
  13. 七、VUE基础——悦听音乐播放器案例(vue+axios)
  14. Windows11 下屏幕亮度自动调整的问题解决
  15. 智慧海洋task04 利用数据进行建模并调参
  16. 没想到你是这样的MethodArgumentNotValidException
  17. win7安装vmware+ubuntu16.04
  18. scss动态生成类名、样式值
  19. 关于DPABI头动参数问题
  20. 倒计时java语言实现_java实现倒计时源码分享

热门文章

  1. Java学习资料-Java常用算法-冒泡排序算法
  2. 玩转html5(三)---智能表单(form),使排版更加方便
  3. [APK拆解]谷歌眼镜XE16设置新语言,当你盯着屏幕时可同步检测
  4. 微软将Silverlight主要定位在Windows Phone,其他平台更多推向HTML5
  5. xEasyApp之后端的介绍
  6. 如何求matlab的in(2.0375),东南大学Matlab作业1.doc
  7. android wheel控件滚动,android 滚动选择插件 android-wheel
  8. edge chrome Android,微软Edge浏览器正式登陆Android平台
  9. python统计合格数_python—基本统计值计算
  10. 查看电脑硬件信息、版本、出厂、内存等各种信息