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.非常简单的键值监听模式相关推荐

  1. android底层按键监听,Android应用中Back键的监听及处理实例

    MainActivity如下: package cn.testnbackpressed; import android.os.Bundle; import android.view.KeyEvent; ...

  2. Android应用中Back键的监听及处理

    MainActivity如下: package cn.testnbackpressed; import android.os.Bundle; import android.view.KeyEvent; ...

  3. android监听应用服务,Android应用中Back键的监听及处理实例

    MainActivity如下: 复制代码 代码如下: package cn.testnbackpressed; import android.os.Bundle; import android.vie ...

  4. android HOME键的监听

    2019独角兽企业重金招聘Python工程师标准>>> Back键的监听 对于Back键的监听比较容易,可以在多个系统回调处拦截,比如在activity的下列方法中都可以收到Back ...

  5. java做一个简单的数据库,哪个嵌入式数据库用Java写成一个简单的键/值存储?

    我最近问了一个关于Neo4j的问题,我有工作,似乎很好.它是可嵌入的,它是用Java编写的,没有(太)许多依赖. 然而,它是一个图形数据库,我不知道这是一个好主意或不使用它作为一个简单的键/值存储. ...

  6. Android中对menu、home、back键的监听

    Android中对menu.home.back键的监听,通过KeyEvent中的常量值来判断用户点击了哪个按钮. 其中对home键的监听需先在manifest文件中添加 <uses-permis ...

  7. 【Home键的监听】

    1. Home 键的事件监听 对于Home键的监听不是那么容易,因为Home键可以将程序退出放在后台,所以这个事件是直接分发给系统,系统接收到之后做相应处理,Home键的事件不是直接传递到应用里面.所 ...

  8. 策略模式,状态模式,监听模式之间的区分。

    把这三个放在一起区分,最主要的原因是这三种模式有共同点,就是都是把行为进行抽象. 1.策略模式一种最简单的.一种策略,当前只能有一个.. 2.状态模式可以说是链接起来的策略模式.强调的是各个策略实体类 ...

  9. 1.设计模式中监听模式(观察者模式)(Python实现)

    目录 1.什么是监听模式 2.监听模式设计思想 3.监听模式的框架模型 4.分别用框架模型和不用框架模型来解决下面的例子 5.模型说明 6.监听模式根据侧重可以分为推模型和拉模型 7.账号异常登录检测 ...

  10. kali linux wifi监听模式,无线渗透教程1:监听无线网络

    第一:配置管理无线网卡 1.1这里,我们使用tplink wn722n, kali linux插上即用,无需安装驱动. 1.2Vmare虚拟机配置如下: 如网卡插入到电脑后,先将虚拟机设置成桥接模式 ...

最新文章

  1. vue-router获取url传参
  2. 浏览器上实现数据的本地存储・小结
  3. 递归删除目录下.svn文件
  4. Linux 进程管理命令
  5. chromium net android移植
  6. Go基础编程:基础数据类型
  7. MySQL基本的SELECT语句,SQL语言概述,基础和重要不冲突,完整详细可收藏
  8. 【JSP】jsp报错:Syntax error, insert } to complete MethodBody
  9. php怎么写for循环,PHP for循环的写法和示例
  10. Dogeswap上线18小时TVL突破300万美金
  11. 《RHEL6.3 FTP服务器虚拟用户的配置(含图)》——如此简单
  12. Jquery中用offset().top和offsetTop的比较
  13. 脚本c语言编程实例,AVR C语言编程通用脚本.doc
  14. 尚学堂马士兵hibernate讲义
  15. 参考文献的序号如何设置
  16. 蓝屏代码stop:0X000000EA(0X85E286B8,0X8635F210,0XF7A53CBC,0X00000001)NV4_DISP是什么意思?
  17. 微信小程序:微信公众号申请微信小程序并认证的步骤
  18. matlab画入射系数和透射系数,反射系数和透射系数.ppt
  19. 区块链跨链技术之BTC Relay
  20. 解锁商业新模式,神奇AR为IP内容“添把火”

热门文章

  1. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_19-CMS前端页面查询开发-页面原型-Table组件测试...
  2. 阶段3 1.Mybatis_06.使用Mybatis完成DAO层的开发_5 Mybatis中使用Dao实现类的执行过程分析-查询方法1...
  3. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_7_Stream流中的常用方法_limit...
  4. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第2节 线程实现方式_14_匿名内部类方式实现线程的创建...
  5. Zabbix proxy配置
  6. Qt + OpenSenceGraph(osg) 加载OSG模型
  7. 51Nod1601 完全图的最小生成树计数 Trie Prufer编码
  8. 关于vue-cli中-webkit-flex-direction: column失效问题
  9. 循环神经(LSTM)网络学习总结
  10. 2018. 2.4 Java中集合嵌套集合的练习