IOS Key-Value Observing (KVO)
kvo,与观察者模式类似,通过给指定的对象设置观察者,来检测对象的变化,当指定的对象的属性被修改后,用于作为观察者的对象会接收到通知。简单的说就是每次指定的被观察的对象的属性被修改后,kvo就会自动通知相应的观察者。系统框架已经支持kvo,所以在开发过程中可以直接使用,非常方便。
| 一、kvo的使用步骤 |
1、注册,指定被观察者的属性
2、实现回调方法
3、移除观察
| 二、通过现实中的小例子介绍一下kvo的用法 |
我有一张银行卡,只要卡内的金额发生的改变,银行就会发短信给我提示,下面通过代码使用kvo来模拟一下这个过程
先创建一个Card银行卡类,卡里有money金额的属性,在初始化这张卡的时候,给卡里金额设置一个初值1000,然后每隔1秒钟模拟消费10元,代码如下:
Card.h
// Card.h
// KVO
//
// Created by jerei on 15-6-5.
// Copyright (c) 2015年 jerehedu. All rights reserved.
// #import <Foundation/Foundation.h> @interface Card : NSObject @property (nonatomic, assign) float money; @end
Card.m
// Card.m
// KVO
//
// Created by jerei on 15-6-5.
// Copyright (c) 2015年 jerehedu. All rights reserved.
// #import "Card.h" @implementation Card -(instancetype)init
{
if (self = [super init]) {
_money = 1000.0; [NSTimer scheduledTimerWithTimeInterval: target:self selector:@selector(changeMoney) userInfo:nil repeats:YES];
}
return self;
} //改变卡内金额
-(void)changeMoney
{
self.money -= ;
} @end
再创建一个People人类,在这个类中有姓名name和card银行卡两个属性。
People.h
// People.h
// KVO
//
// Created by jerei on 15-6-5.
// Copyright (c) 2015年 jerehedu. All rights reserved.
// #import <Foundation/Foundation.h> @class Card; @interface People : NSObject @property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) Card *card; -(id)initWithName:(NSString *)name andCard:(Card *)card; @end
People.m
// People.m
// KVO
//
// Created by jerei on 15-6-5.
// Copyright (c) 2015年 jerehedu. All rights reserved.
// #import "People.h"
#import "Card.h" @implementation People -(id)initWithName:(NSString *)name andCard:(Card *)card
{
if (self = [super init]) {
_name = name;
_card = card;
} return self;
} @end
创建好了两个类之后,在People类中通过kvo来监测银行卡中金额的变化
1、人需要监听银行账户中的金额,需要注册监听对象
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;
调用方法的是被监听的对象,参数分别为:
addObserver:观察者
forKeyPath:被监听的对象的属性,属性里面还有属性的,可以用点语法
options:想监听的对象是什么操作,比如初始化、有新的值
context:上下文,一般为nil,当KeyPath:相同时,可以用它来区分
因此,在People.m中需要添加的代码为:
-(id)initWithName:(NSString *)name andCard:(Card *)card
{
if (self = [super init]) {
_name = name;
_card = card; //注册,添加观察者
[_card addObserver:self forKeyPath:@"money" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
} return self;
}
2、一旦注册了,就可以去回调函数中感知变化过程
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
observeValueForKeyPath:字符串,被监听的属性
ofObject:哪一个对象被监听
change:字典,包含了变化前和变化后的值
context:上下文
因此,在People.m中需要实现回调方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"回调方法 %@",change);
}
3、解除监听对象
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;
调用方法的是被监听的对象
removeObserver:观察者
forKeyPath:字符串
因此,在People.m中重写dealloc方法,实现移除监听者
-(void)dealloc
{
[_card removeObserver:self forKeyPath:@"money"];
}
4、ps: kvo属性值改变时,不能直接改值
例子中Card类中有一个changeMoney方法,在这个方法中修改了被监听属性的值,下面介绍4中方法给大家。
-(void)changeMoney
{
//不能直接改值!!!!
_money -= ; //错误的 //1.点语法
self.money -= ; //2. set方法
float f = _money-;
[self setMoney:f]; //3. kvc
[self setValue:@(f) forKey:@"money"]; //4.
[self willChangeValueForKey:@"money"];
_money -= ;
[self didChangeValueForKey:@"money"]; }
如有疑问咨询或技术交流,请加入官方QQ群:
(452379712)
出处:http://www.cnblogs.com/jerehedu/
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
IOS Key-Value Observing (KVO)的更多相关文章
- iOS开发——实用篇&KVO与KVC详解
KVO与KVC详解 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC ...
- iOS开发-KVC和KVO的理解
KVC和KVO看起来很专业,其实用起来还是比较简单的,KVC(Key-value coding)可以理解为键值对编码,如果对象的基本类型,那么键值对编码实际上和get,set方法没有区别,如果是属性是 ...
- IOS开发之KVC KVO KVB
KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的 ...
- NSNotificationCenter(通知)与Key-Value Coding (KVC)与Key-Value Observing (KVO)
NSNotificationCenter //下面是不同类中需要实现的代码 1.[[NSNotificationCenter defaultCenter] addObserver:self selec ...
- iOS开发——UI基础-KVO
KVO == Key Value Observing 作用: 可以监听某个对象属性的改变 一.使用KVO Person *p = [Person new]; p.name = @"chg&q ...
- iOS基础 - KVC and KVO
一.KVC(key value coding) 我们一般是通过调用set方法或属性的点语法来直接更改对象的状态,即对象的属性值,比如[stu setAge:10]; stu.age = 9; KVC ...
- 【iOS】KVC 和 KVO 的使用场景
http://blog.csdn.net/chenglibin1988/article/details/38259865 Key Value Coding Key Value Coding是coc ...
- iOS key value coding kvc在接收json数据与 model封装中的使用
iOS key value coding kvc在接收json数据与 model封装中的使用 使用 kvc 能够极大的简化代码工作,及以后的接口维护工作: 1:先创建MovieModel类.h和 . ...
- KVO(Key Value Observing)
*KVO能够监听某个对象属性的改变 原理:仅仅要给一个对象注冊一个监听,那么在执行时, 系统就会自己主动给该对象生成一个子类对象,而且重写自己主动生成的子类对象的被监听属性的set方法.然后在set方 ...
随机推荐
- 美团外卖Android平台化的复用实践
美团外卖平台化复用主要是指多端代码复用,正如美团外卖iOS多端复用的推动.支撑与思考文章所述,多端包含有两层意思:其一是相同业务的多入口,指美团外卖业务需要在美团外卖App(下文简称外卖App)和美团 ...
- Jquery的方法(一)
一.文档操作1.内部插入:append(),appendTo(),prepend():2.外部插入:after(),before():3.删除操作:remove(),empty():4.克隆操作:cl ...
- 洛谷P2746 USACO5.1 校园网
题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中. 你要写 ...
- SCP用法
scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port ...
- Apache参数的优化(转)
按照前面提到的版本问题,Apache可以直接使用2.0版本产品线.针对Apache的优化主要是针对httpd.conf的优化,当然还有其他地方,如果特别留意的话,网上常有专家惊呼“居然这么多人忽略xx ...
- POJ 3468 A Simple Problem with Integers (splay tree入门)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 47944 ...
- 支付宝支付-常用支付API详解(查询、退款、提现等)-转
所有的接口支持沙盒环境的测试 1.前言 前面几篇文件详细介绍了 支付宝提现.扫码支付.条码支付.Wap支付.App支付 支付宝支付-提现到个人支付宝 支付宝支付-扫码支付 支付宝支付-刷卡支付(条码支 ...
- 【Go入门教程5】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)
这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...
- MySQL优化器的成本模型
http://www.orczhou.com/index.php/2016/08/mysql-optimizer-cost-model-1/V
- ansible saltstart puppet
百台以下用ansible , 百台-千台用saltstart , 千台以上用puppet