一,概述

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

二,使用方法

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

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

2. 实现回调方法

3. 移除观察

三,实例:

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

//1.定义DataModel,

@interface StockData : NSObject {

NSString * stockName;

NSString * price;

}

@end

@implementation StockData

@end

//

//  ViewController.m

//  testKVO

//

//  Created by huangbo on 13-11-28.

//  Copyright (c) 2013年 tencent. All rights reserved.

//

#import "ViewController.h"

#import "DataModel.h"

@interfaceViewController ()

{

StockData *stockForKVO;

UILabel *myLabel;

UILabel *myLabel2;

}

@end

@implementation ViewController

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

- (void)viewDidLoad

{

[superviewDidLoad];

stockForKVO = [[StockDataalloc] init];

[stockForKVOsetValue:@"searph"forKey:@"stockName"];

[stockForKVOsetValue:@"10.0"forKey:@"price"];

[stockForKVOaddObserver:selfforKeyPath:@"price"options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOldcontext:NULL];

myLabel = [[UILabelalloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];

myLabel.textColor = [UIColorredColor];

myLabel.text = [stockForKVOvalueForKey:@"price"];

[self.viewaddSubview:myLabel];

myLabel2 = [[UILabelalloc]initWithFrame:CGRectMake(100, 200, 100, 30 )];

myLabel2.textColor = [UIColorredColor];

myLabel2.text = [stockForKVOvalueForKey:@"price"];

[self.viewaddSubview:myLabel2];

UIButton * b = [UIButtonbuttonWithType:UIButtonTypeRoundedRect];

b.frame = CGRectMake(100,10, 100, 30);

[b addTarget:selfaction:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];

[self.viewaddSubview:b];

}

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

-(void) buttonAction

{

[stockForKVOsetValue:@"20.0"forKey:@"price"];

}

//4. 实现回调方法

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

if([keyPath isEqualToString:[NSStringstringWithFormat:@"%@",@"price"]])

{

myLabel.text = [stockForKVOvalueForKey:@"price"];

myLabel2.text = [NSStringstringWithFormat:@"%.1f", [[stockForKVOvalueForKey:@"price"] floatValue]*2];

}

}

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

- (void)dealloc

{

[superdealloc];

[stockForKVOremoveObserver:selfforKeyPath:@"price"];

[stockForKVOrelease];

}

/*四,小结

KVO这种编码方式使用起来很简单,很适用与datamodel修改后,

引发的UIVIew的变化这种情况,

就像上边的例子那样,当更改属性的值后,监听对象会立即得到通知*/

//hb

/*

kvo的思想是将类和控件绑定在一起,通过改变类变量的值改变控件的属性

机制是,通过改变属性后监听对象会立即得到通知

*/

- (void)didReceiveMemoryWarning

{

[superdidReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

KVO初探的更多相关文章

  1. 初探领域驱动设计(2)Repository在DDD中的应用

    概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...

  2. CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探

    CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...

  3. iOS---观察者模式之--->KVO

    文章结构如下: Why? (为什么要用KVO) What? (KVO是什么) How? ( KVO怎么用) More (更多细节) 原理 自己实现KVO 在我的上一篇文章浅谈 iOS Notifica ...

  4. 从273二手车的M站点初探js模块化编程

    前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...

  5. JavaScript学习(一) —— 环境搭建与JavaScript初探

    1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...

  6. .NET文件并发与RabbitMQ(初探RabbitMQ)

    本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...

  7. React Native初探

    前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...

  8. iOS开发--Swift RAC响应式编程初探

    时间不是很充足, 先少说点, RAC的好处是响应式编程, 不需要自己去设置代理委托, target, 而是主要以信息流(signal), block为主, 看到这里激动吧, 它可以帮你监听你的事件, ...

  9. Objective-C之KVC、KVO

    1,KVC(键值编码)  Key Value Coding 1.1在C#中,可以通过字符串反射来获取对象,从而对对象的属性进行读写,Object-C中有同样的实现,通过字符串(属性名词)对对象的属性进 ...

随机推荐

  1. android ROM备份和还原,再也不用当心刷到垃圾ROM,而还原不了原有系统

    安卓刷机后如何还原以前ROM 和系统备份,本教程为大家介绍刷机后如何还原到以前的ROM 和系统备份. 很多人,看到了好多新的rom,包括测试版的新rom,心里痒痒的.想刷一刷.尝尝鲜,结果刷完,感觉新 ...

  2. 创建maven项目出现的问题

    右击项目无法显示maven图标,创建的pom.xml无法识别,并且创建maven项目时,一直显示Loading archetype list...

  3. C# SQL 整表插入 分类: C# 2014-09-17 16:18 369人阅读 评论(2) 收藏

    说明: (1)表A的一部分数据插入到表B (2)DataAccess 类,是放在DAL层下的底层类; da.StrConnection 写在DataAccess类中; //整表插入方法 private ...

  4. uboot中的mmc命令

    一:mmc的命令例如以下: 1:对mmc读操作 mmc read addr blk# cnt 2:对mmc写操作 mmc write addr blk# cnt 3:对mmc擦除操作 mmc eras ...

  5. MapReduce分析明星微博数据

    互联网时代的到来,使得名人的形象变得更加鲜活,也拉近了明星和粉丝之间的距离.歌星.影星.体育明星.作家等名人通过互联网能够轻易实现和粉丝的互动,赚钱也变得前所未有的简单.同时,互联网的飞速发展本身也造 ...

  6. Thread Runnable 多线程

    1. 实现多线程的两种方法         a) 让这个类继承java.lang.Thread,然后重写run方法         b) 让这个类实现 java.lang.Runnable接口,实现r ...

  7. 原创翻译:iOS 应用程序 蓝牙后台运行

    默认情况下,普通的CoreBluetooth 任务中的大多数,无论是Central还是peripheral ,在后台或者挂起状况下都是无法进行的.也就是说,你可以通过宣布你的应用程序支持后台处理模式来 ...

  8. eclipse下将普通的java工程转换成web工程

    开发过程中需要对普通的java工程转换成动态的web工程,网络上查询了资料很简单的几步操作就可以搞定,操作步骤如下: 编辑.project 修改以下配置 <nature>org.eclip ...

  9. PL/SQL Select into 异常处理

    在使用select into 为变量赋值时,如果变量是集合类型,不会产生异常,而如果是基本类型或记录类型,则会报异常. 异常产生了怎么办?当然是捕获并处理啦. 对于普通的代码块来说,在代码块的结尾处理 ...

  10. asp.net利用ajax和jquery-ui实现进度条

    前台用ajax不停进行查询,直到任务完成.进度条用的是jquery-ui.后台用一般处理程序处理相应,进度信息保存在HttpContext.Application中. 代码作为简单示例,实际应用时应对 ...