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方 ...
随机推荐
- Java还是程序员的金饭碗
可能会存在一种更快,更简单的编程语言,但就目前来说,根据Stack Overflow的最新统计,“传统”的编程语言依然在赚着大把的钱.在2013年,招聘程序员时,搜索最多的技能关键字是Java,几乎有 ...
- 【枚举】【贪心】Codeforces Round #482 (Div. 2) B. Treasure Hunt
题意:给你3个字符串,3个人各对自己的字符串执行n轮操作,每一次选择一个字符变为任意一个和原来不同的字符.最后问你谁能使自己的串中的任意重复子串出现的次数最大化. 显然只需关注字符而非子串. 枚举每个 ...
- 【原创】实战padding oracle漏洞
首先关于padding oracle漏洞的原理请看: 步入正传~~ 搭建漏洞利用环境Perl 环境下载地址:链接:http://pan.baidu.com/s/1skFxVm1 密码:anuw 首先查 ...
- BZOJ 2749 HAOI 2012 外星人 数论 欧拉函数
题意: 给出一个数,给出的形式是其分解质因数后,对应的质因数pi及其次数qi,问对这个数不停求phi,直至这个数变成1,需要多少次.(多组数据) 范围:pi <= 1e5,qi <= 1e ...
- wxFormBuilder初体验
第一步 打开wxFormBuilder 修改工程信息并保存工程 Name: 工程名 File: 生成代码(.py)文件名 Code_generation: 生成代码类型 第二步 创建窗体 切换至for ...
- Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) B. Problems for Round 水题
B. Problems for Round 题目连接: http://www.codeforces.com/contest/673/problem/B Description There are n ...
- Github好用的Python库使用学习日记
开源好用的Python库 Overview 所有内容基本源于下面的两个网站 awesome-python python3官方文档 you-get(命令行操作的媒体下载工具) you-get的git项目 ...
- Remon Spekreijse CSerialPort用法
在程序中如果要用到多个串口,而且还要做很多复杂的处理,那么最好不用MSComm通讯控件,如果这时你还不愿意自己编写底层,就用这个类:CserialPort类.作者是 Remon Spekreijse ...
- C#程序集系列11,全局程序集缓存
全局程序集缓存(GAC:Global Assembly Cache)用来存放可能被多次使用的强名称程序集.当主程序需要加载程序集的时候,优先选择到全局程序集缓存中去找寻需要的程序集. 为什么需要全局程 ...
- [转载] MATLAB快捷键
原文地址,点此查看 一.常用对象操作 除了一般windows窗口的常用功能键外. 1.!dir 可以查看当前工作目录的文件. !dir& 可以在dos状态下查看. 2.who 可以查看当前 ...