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:1 target:self selector:@selector(changeMoney) userInfo:nil repeats:YES];}return self;
}//改变卡内金额
-(void)changeMoney
{self.money -= 10;
}@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 -= 10; //错误的//1.点语法self.money -= 10;//2. set方法float f = _money-10;[self setMoney:f];//3. kvc[self setValue:@(f) forKey:@"money"];//4.[self willChangeValueForKey:@"money"];_money -= 10;[self didChangeValueForKey:@"money"];}

  如有疑问咨询或技术交流,请加入官方QQ群: (452379712)

作者:杰瑞教育
出处:http://www.cnblogs.com/jerehedu/ 
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/jerehedu/p/4580088.html

IOS Key-Value Observing (KVO)相关推荐

  1. iOS之深入解析KVO的底层原理

    一.KVO 简介 ① 概念 KVO 全称 Key Value Observing,是苹果提供的一套事件通知机制,允许对象监听另一个对象特定属性的改变,并在改变时接收到事件. 由于 KVO 的实现机制, ...

  2. iOS 中KVC、KVO、NSNotification、delegate 总结及区别

    iOS 中KVC.KVO.NSNotification.delegate 总结及区别 1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属 ...

  3. iOS底层原理之KVO本质

    面试中常会问道: iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?) 如何手动触发KVO 什么是KVO 首先需要了解KVO基本使用,KVO的全称 Key-Value Observing, ...

  4. 【iOS】—— KVC与KVO

    KVC与KVO 一.KVC 1.简单介绍 2.常见的API 3.key和keyPath的区别 4.KVC原理 4.1 `setValue:forKey: `的原理(KVC赋值原理) 4.2 `valu ...

  5. 【iOS】KVC 与 KVO

    一.KVC与KVO *"KVC":key value Coding(键值编码) *目的:间接的修改或获取对象的属性,降低程序(类与类)之间的耦合度. *"KVO" ...

  6. 【iOS】--KVC与KVO

    键值编码(KVC)与键值监听(KVO) KVC(Key Value Coding)允许以字符串的形式间接操作对象的属性. 简单的KVC 最基本的KVC由NSKeyValueCoding协议提供支持,最 ...

  7. iOS开发底层之KVO探索下 -18

    文章目录 一.自定义KVO 1. 新建一个分类,名称为:NSOBject+MyKVO, 仿照系统KVO的方法写, 基本代码如下: 2. 监听的keyPath,是否存在setter方法,不让成员变量也能 ...

  8. 转: The Code Commandments: Best Practices for Objective-C Coding (updated for ARC)

    PrefaceI don't normally post highly technical stuff to my blog, but here's an exception that I hope ...

  9. The Code Commandments: Best Practices for OCCoding

    2019独角兽企业重金招聘Python工程师标准>>> Preface I don't normally post highly technical stuff to my blog ...

最新文章

  1. genesis cam 最新版_触屏精灵下载_触屏精灵最新版下载[其他行业]
  2. 《赢道:成功创业者的28条戒律》成都签售会魅力登场(背景)
  3. 嬴彻科技完成L4级重卡无人驾驶路测
  4. narwal无法连接机器人_懒无止境 能自己洗抹布的云鲸J1扫拖机器人
  5. Matplotlib实例教程(三)折线图 plt.plot()
  6. Android 图片选择器、图片剪切,文件选择器
  7. 关于onclick点击无效问题
  8. linux zip命令收藏
  9. 你还在手写 CRUD?试试 MybatisGenerator,再也不用加班了!
  10. 5分钟搞定内存字节对齐
  11. c# 类似Excel的趋势线拟合
  12. 【数据仓库】 BI 项目管理之角色和职责
  13. java poi框架导出excel如何插入特殊字符(复选框勾选)
  14. ERP系统更改颜色操作步骤
  15. 共模和差模信号及其噪音抑制
  16. MySQL 报错1055
  17. [19保研]北京邮电大学计算机学院6月9日校园开放日活动安排
  18. 一些国外的MD5破解网站
  19. DV、LS路由算法Java编程实现
  20. GEEer成长日记十七:在Google Earth Engine(GEE)中批量下载MODIS NDVI数据

热门文章

  1. oracle中如何插入
  2. 03-命令图片.doc
  3. [LeetCode]二进制求和
  4. word2vec 评测 sg=0 sg=1 size=100 window=3
  5. 1.1 sql注入分类与详解
  6. '无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称' 或 'vue不是内部或外部命令' 的解决方法...
  7. windows快捷键命令汇总整理
  8. php绝对路径与相对路径之间关系的的深入研究
  9. eclipse/MyEclipse 日期格式、注释日期格式、时区问题
  10. grailsgroovy的IllegalArgument异常