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方 ...
随机推荐
- (四)静态断言(上),assert,NDEBUG, 以及通过宏定义处理文件包含关系
一.断言:运行时与预处理时 断言(assertion)是一种编程常用的手段.想必大家都见过 assert 吧.今天我们就来了解一下它. 通常情况下,断言就是将一个返回值总是需要为真的判别式放在语句中, ...
- iOS 11开发教程(三)运行第一个iOS 11程序
iOS 11开发教程(三)运行第一个iOS 11程序 运行iOS11程序 创建好项目之后,就可以运行这个项目中的程序了.单击运行按钮,如果程序没有任何问题的话,会看到如图1.6和1.7的运行效果. 图 ...
- 【构造】Codeforces Round #480 (Div. 2) B. Marlin
题意:给你一个4*n的网格,保证n为奇数,让你在其中放k个障碍物,不能放在边界的格子上,使得从左上角走到右下角的最短路的方案数,恰好等于从左下角走到右上角的最短路的方案数. k为偶数时,以纵向为对称轴 ...
- Go语言特点
作者:asta谢链接:https://www.zhihu.com/question/21409296/answer/18184584来源:知乎 1.Go有什么优势 可直接编译成机器码,不依赖其他库,g ...
- 20162303 解读同伴的收获&解决同伴的问题 周三补交
解读同伴的收获&解决同伴的问题 11月29号 解决同伴的问题 我的同组同学是20162307学号张韵琪同学 同组同学的问题是动态规划算法步骤中递归定义的最优值 我理解他的意思是她不太理解最优值 ...
- bzoj 1027 floyd求有向图最小环
结合得好巧妙.... 化简后的问题是: 给你两个点集A,B,求B的一个子集BB,使得BB的凸包包含A的凸包,求BB的最小大小. 先特判答案为1,2的情况,答案为3的情况,我们先构造一个有向图: 对于B ...
- Trie树之C-实现
title: Trie树之C++实现 comments: true date: 2016-10-02 16:59:54 categories: 算法 tags: Trie树 前言 之前写了一篇偏向于理 ...
- 洛谷P3119 USACO15JAN 草鉴定
题目描述 In an effort to better manage the grazing patterns of his cows, Farmer John has installed one-w ...
- PIXIV 爬取国际前100名代码
PYTHON爬虫 爬取PIXIV国际前100名的代码 代码是别人的,那天学习爬虫的时候看到了,写的很厉害~ 学习学习 #coding:UTF-8 __author__ = 'monburan' __v ...
- [Visual Studio] SOA服务框架搭建
1.服务框架搭建 2.服务模板创建 3.Nuget引用 4.客户端调用 任务点: 1.分析SOA 2.修改SOA架构名称以及关键字 3.使用Nuget添加引用 4.选择服务模板进行创建 5.尝试调用 ...