KVO.非常简单的键值监听模式
iOS中有两种支持机制:Notification和KVO(Key-Value Observing)
KVO是iOS中的一个核心概念,简单理解就是:关注Model某个数据(Key)的对象可以注册为监听器,一旦Model某个Key的Value发生变化,就会广播给所有的监听器
KVO:KVO是一个怎么样的Cocoa机制?
答:Kvo(Key Value Coding)是cocoa中用来设值或取值的协议(NSKeyValueCoding),跟java的ejb有点类似。都是通过对变量和函数名进行规范达到方便设置类成员值的目的.它是Cocoa的一个重要机制,它有点类似于Notification,但是,它提供了观察某一属性变化的方法,而Notification需要一个发送notification的对象,这样KVO就比Notification极大的简化了代码。这种观察-被观察模型适用于这样的情况,比方说根据A(数据类)的某个属性值变化,B(view类)中的某个属性做出相应变化。对于推崇MVC的cocoa而言,kvo应用价值很高。
kvo的使用方法:
1、注册: -(void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context keyPath就是要观察的属性值,options给你观察键值变化的选择,而context方便传输你需要的数据(注意这是一个void型)
2、实现变化方法:
-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context change里存储了一些变化的数据,比如变化前的数据,变化后的数据;如果注册时context不为空,这里context就能接收到。是不是很简单?kvo的逻辑非常清晰,实现步骤简单
// // ViewController.m // KVO_TestDemo // // Created by yingkong1987 on 12-7-24. // Copyright (c) 2012年 __MyCompanyName__. All rights reserved. // #import "ViewController.h" #import "DataModel.h"@interface ViewController ()@end@implementation ViewController @synthesize dataModel;- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib. DataModel *mod = [[DataModel alloc] init];self.dataModel = mod;[mod release];[self.dataModel addObserver:self forKeyPath:@"dataString" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL]; }- (void)viewDidUnload {[super viewDidUnload];// Release any retained subviews of the main view. }- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); }#pragma mark - ButtonClick Method - (void)changeValueButtonClick:(id)sender { // [self.dataModel setValue:[NSNumber numberWithInt:(arc4random()%20)] forKey:@"needObserverValue"]; // self.dataModel.needObserverValue = arc4random()%20;self.dataModel.dataString = [NSString stringWithFormat:@"今天捡到%d块钱",arc4random()%20]; }#pragma mark - KVO Delegate - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {NSLog(@"%@",keyPath);NSLog(@"%@ %@",object,self.dataModel);NSLog(@"%@",change);NSLog(@"%@",self.dataModel.dataString); }@end
// // DataModel.h // KVO_TestDemo // // Created by yingkong1987 on 12-7-24. // Copyright (c) 2012年 __MyCompanyName__. All rights reserved. // #import <Foundation/Foundation.h>@interface DataModel : NSObject@property (nonatomic,retain)NSString *dataString;@end
转载于:https://www.cnblogs.com/yingkong1987/archive/2012/07/24/2606580.html
KVO.非常简单的键值监听模式相关推荐
- android底层按键监听,Android应用中Back键的监听及处理实例
MainActivity如下: package cn.testnbackpressed; import android.os.Bundle; import android.view.KeyEvent; ...
- Android应用中Back键的监听及处理
MainActivity如下: package cn.testnbackpressed; import android.os.Bundle; import android.view.KeyEvent; ...
- android监听应用服务,Android应用中Back键的监听及处理实例
MainActivity如下: 复制代码 代码如下: package cn.testnbackpressed; import android.os.Bundle; import android.vie ...
- android HOME键的监听
2019独角兽企业重金招聘Python工程师标准>>> Back键的监听 对于Back键的监听比较容易,可以在多个系统回调处拦截,比如在activity的下列方法中都可以收到Back ...
- java做一个简单的数据库,哪个嵌入式数据库用Java写成一个简单的键/值存储?
我最近问了一个关于Neo4j的问题,我有工作,似乎很好.它是可嵌入的,它是用Java编写的,没有(太)许多依赖. 然而,它是一个图形数据库,我不知道这是一个好主意或不使用它作为一个简单的键/值存储. ...
- Android中对menu、home、back键的监听
Android中对menu.home.back键的监听,通过KeyEvent中的常量值来判断用户点击了哪个按钮. 其中对home键的监听需先在manifest文件中添加 <uses-permis ...
- 【Home键的监听】
1. Home 键的事件监听 对于Home键的监听不是那么容易,因为Home键可以将程序退出放在后台,所以这个事件是直接分发给系统,系统接收到之后做相应处理,Home键的事件不是直接传递到应用里面.所 ...
- 策略模式,状态模式,监听模式之间的区分。
把这三个放在一起区分,最主要的原因是这三种模式有共同点,就是都是把行为进行抽象. 1.策略模式一种最简单的.一种策略,当前只能有一个.. 2.状态模式可以说是链接起来的策略模式.强调的是各个策略实体类 ...
- 1.设计模式中监听模式(观察者模式)(Python实现)
目录 1.什么是监听模式 2.监听模式设计思想 3.监听模式的框架模型 4.分别用框架模型和不用框架模型来解决下面的例子 5.模型说明 6.监听模式根据侧重可以分为推模型和拉模型 7.账号异常登录检测 ...
- kali linux wifi监听模式,无线渗透教程1:监听无线网络
第一:配置管理无线网卡 1.1这里,我们使用tplink wn722n, kali linux插上即用,无需安装驱动. 1.2Vmare虚拟机配置如下: 如网卡插入到电脑后,先将虚拟机设置成桥接模式 ...
最新文章
- vue-router获取url传参
- 浏览器上实现数据的本地存储・小结
- 递归删除目录下.svn文件
- Linux 进程管理命令
- chromium net android移植
- Go基础编程:基础数据类型
- MySQL基本的SELECT语句,SQL语言概述,基础和重要不冲突,完整详细可收藏
- 【JSP】jsp报错:Syntax error, insert } to complete MethodBody
- php怎么写for循环,PHP for循环的写法和示例
- Dogeswap上线18小时TVL突破300万美金
- 《RHEL6.3 FTP服务器虚拟用户的配置(含图)》——如此简单
- Jquery中用offset().top和offsetTop的比较
- 脚本c语言编程实例,AVR C语言编程通用脚本.doc
- 尚学堂马士兵hibernate讲义
- 参考文献的序号如何设置
- 蓝屏代码stop:0X000000EA(0X85E286B8,0X8635F210,0XF7A53CBC,0X00000001)NV4_DISP是什么意思?
- 微信小程序:微信公众号申请微信小程序并认证的步骤
- matlab画入射系数和透射系数,反射系数和透射系数.ppt
- 区块链跨链技术之BTC Relay
- 解锁商业新模式,神奇AR为IP内容“添把火”
热门文章
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_19-CMS前端页面查询开发-页面原型-Table组件测试...
- 阶段3 1.Mybatis_06.使用Mybatis完成DAO层的开发_5 Mybatis中使用Dao实现类的执行过程分析-查询方法1...
- 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_7_Stream流中的常用方法_limit...
- 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第2节 线程实现方式_14_匿名内部类方式实现线程的创建...
- Zabbix proxy配置
- Qt + OpenSenceGraph(osg) 加载OSG模型
- 51Nod1601 完全图的最小生成树计数 Trie Prufer编码
- 关于vue-cli中-webkit-flex-direction: column失效问题
- 循环神经(LSTM)网络学习总结
- 2018. 2.4 Java中集合嵌套集合的练习