KVO的概述的使用
一,概述
KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。
二,使用方法
系统框架已经支持KVO,所以程序员在使用的时候非常简单。
1. 注册,指定被观察者的属性,
2. 实现回调方法
3. 移除观察
三,实例:
假设一个场景,股票的价格显示在当前屏幕上,当股票价格更改的时候,实时显示更新其价格。
1.定义DataModel,
- @interface StockData : NSObject {
 - NSString * stockName;
 - float price;
 - }
 - @end
 - @implementation StockData
 - @end
 
@interface StockData : NSObject {
    NSString * stockName;
    float price;
}
@end
@implementation StockData
@end
2.定义此model为Controller的属性,实例化它,监听它的属性,并显示在当前的View里边
- - (void)viewDidLoad
 - {
 - [super viewDidLoad];
 - stockForKVO = [[StockData alloc] init];
 - [stockForKVO setValue:@"searph" forKey:@"stockName"];
 - [stockForKVO setValue:@"10.0" forKey:@"price"];
 - [stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
 - myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];
 - myLabel.textColor = [UIColor redColor];
 - myLabel.text = [stockForKVO valueForKey:@"price"];
 - [self.view addSubview:myLabel];
 - UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];
 - b.frame = CGRectMake(0, 0, 100, 30);
 - [b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
 - [self.view addSubview:b];
 - }
 
- (void)viewDidLoad
{
[super viewDidLoad]; stockForKVO = [[StockData alloc] init];
[stockForKVO setValue:@"searph" forKey:@"stockName"];
[stockForKVO setValue:@"10.0" forKey:@"price"];
[stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL]; myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];
myLabel.textColor = [UIColor redColor];
myLabel.text = [stockForKVO valueForKey:@"price"];
[self.view addSubview:myLabel]; UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];
b.frame = CGRectMake(0, 0, 100, 30);
[b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:b]; }
3.当点击button的时候,调用buttonAction方法,修改对象的属性
- -(void) buttonAction
 - {
 - [stockForKVO setValue:@"20.0" forKey:@"price"];
 - }
 
-(void) buttonAction
{
[stockForKVO setValue:@"20.0" forKey:@"price"];
}
4. 实现回调方法
- -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
 - {
 - if([keyPath isEqualToString:@"price"])
 - {
 - myLabel.text = [stockForKVO valueForKey:@"price"];
 - }
 - }
 
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if([keyPath isEqualToString:@"price"])
{
myLabel.text = [stockForKVO valueForKey:@"price"];
}
}
5.增加观察与取消观察是成对出现的,所以需要在最后的时候,移除观察者
- - (void)dealloc
 - {
 - [super dealloc];
 - [stockForKVO removeObserver:self forKeyPath:@"price"];
 - [stockForKVO release];
 - }
 
- (void)dealloc
{
[super dealloc];
[stockForKVO removeObserver:self forKeyPath:@"price"];
[stockForKVO release];
}
四,小结
KVO这种编码方式使用起来很简单,很适用与datamodel修改后,引发的UIVIew的变化这种情况,就像上边的例子那样,当更改属性的值后,监听对象会立即得到通知。
KVO的概述的使用的更多相关文章
- kvo原理概述
		
kvo概述 kvo,全称Key-Value Observing,它提供了一种方法,当对象某个属性发生改变时,允许监听该属性值变化的对象可以接受到通知,然后通过kvo的方法响应一些操作. kvo实现原理 ...
 - KVO的概述与使用
		
一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知 ...
 - iOS KVO概述
		
iOS KVO概述 面试中经常会被问到:什么是KVO?这个问题既然出现概率这么大,那么我们就来详细讲一讲到底什么是KVO.下次再有面试官问你的时候,你就可以娓娓道来,以彰显高逼格 概述 问:什么是KV ...
 - iOS:KVO/KVC 的概述与使用
		
iOS:KVO/KVC 的概述与使用 KVO APP开发技术QQ群:347072638 一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性 ...
 - iOS开发系列--Objective-C之KVC、KVO
		
概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听( ...
 - iOS--KVO的概述与使用
		
一.概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应 ...
 - Objective-C语法之KVO使用
		
本文转自:http://blog.csdn.net/yuquan0821/article/details/6646400/ 一,概述 KVO,即:Key-Value Observing,它提供一种机制 ...
 - KVO设计模式
		
一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应 ...
 - NSRunLoop 概述和原理
		
NSRunLoop 概述和原理 1.什么是NSRunLoop? 我们会经常看到这样的代码: - (IBAction)start:(id)sender { pageStillLoading = YES; ...
 
随机推荐
- Java 8十个lambda表达式案例
			
1. 实现Runnable线程案例 使用() -> {} 替代匿名类: //Before Java 8: new Thread(new Runnable() { @Override public ...
 - 网页CSS1
			
样式的属性 1,背景与前景 background-color: //背景的颜色 background-image:url //背景图片 background-attachment:fixed; //背 ...
 - 理解prototype、proto和constructor的三角关系
			
javascript里的关系又多又乱.作用域链是一种单向的链式关系,还算简单清晰:this机制的调用关系,稍微有些复杂:而关于原型,则是prototype.proto和constructor的三角关系 ...
 - Linux操作系统分析__破解操作系统的奥秘
			
学号:SA12226343 姓名:sunhongbo 一.操作系统工作的基础 存储程序计算机和堆栈(函数调用堆栈)机制以及中断机制是操作系统工作的基础. 现代计算机仍采用存储程序计算机的结构体系和工 ...
 - (转)chm格式的电子书打开是空白的解决办法
			
当我们从网络上下载chm格式的电子书到本地后,打开就发现chm格式的电子书右边的目录是正常的,但是chm格式的电子书内容部分却是空白的情况,很多时候我们都以为是中毒了,但是用杀毒软件却杀不出来,其实很 ...
 - ArcEngine - 栅格数据访问的-对象模型
 - jQuery选择器全解
			
本篇介绍jQuery的选择器,jQuery选择器按照功能上分为"选择"和"过滤",并且是配合使用的.过滤的主要作用是从前面选定的选择器中选择的内容重进行筛选. ...
 - O、Ω、Θ表示
			
转载,原网址为:http://book.2cto.com/201211/8127.html 对于任何数学函数,这三个记号可以用来度量其“渐近表现”,即当趋于无穷大时的阶的情况,这是算法分析中非常重要的 ...
 - [Android分享] 如何解决Android 5.0中出现的警告:Service Intent must be explicit
			
Android 5.0程序运行报Service Intent must be explicit错误,原因是5.0的service必须显式调用 改成 Intent intent = new Intent ...
 - python之7-3对象的信息/方法获取
			
我们可以用dir()来获取一个类,一个模块,一个字符串的信息/方法 例如: #可以列出Image模块的方法 >>import Image >>dir(Image) #列出字符串 ...