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)的更多相关文章

  1. iOS开发——实用篇&KVO与KVC详解

    KVO与KVC详解 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC ...

  2. iOS开发-KVC和KVO的理解

    KVC和KVO看起来很专业,其实用起来还是比较简单的,KVC(Key-value coding)可以理解为键值对编码,如果对象的基本类型,那么键值对编码实际上和get,set方法没有区别,如果是属性是 ...

  3. IOS开发之KVC KVO KVB

    KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的 ...

  4. NSNotificationCenter(通知)与Key-Value Coding (KVC)与Key-Value Observing (KVO)

    NSNotificationCenter //下面是不同类中需要实现的代码 1.[[NSNotificationCenter defaultCenter] addObserver:self selec ...

  5. iOS开发——UI基础-KVO

    KVO == Key Value Observing 作用: 可以监听某个对象属性的改变 一.使用KVO Person *p = [Person new]; p.name = @"chg&q ...

  6. iOS基础 - KVC and KVO

    一.KVC(key value coding) 我们一般是通过调用set方法或属性的点语法来直接更改对象的状态,即对象的属性值,比如[stu setAge:10];  stu.age = 9; KVC ...

  7. 【iOS】KVC 和 KVO 的使用场景

    http://blog.csdn.net/chenglibin1988/article/details/38259865   Key Value Coding Key Value Coding是coc ...

  8. iOS key value coding kvc在接收json数据与 model封装中的使用

    iOS key value coding  kvc在接收json数据与 model封装中的使用 使用 kvc 能够极大的简化代码工作,及以后的接口维护工作: 1:先创建MovieModel类.h和 . ...

  9. KVO(Key Value Observing)

    *KVO能够监听某个对象属性的改变 原理:仅仅要给一个对象注冊一个监听,那么在执行时, 系统就会自己主动给该对象生成一个子类对象,而且重写自己主动生成的子类对象的被监听属性的set方法.然后在set方 ...

随机推荐

  1. JAVAEE——SpringMVC第二天:高级参数绑定、@RequestMapping、方法返回值、异常处理、图片上传、Json交互、实现RESTful、拦截器

    1. 课前回顾 https://www.cnblogs.com/xieyupeng/p/9093661.html 2. 课程计划 1.高级参数绑定 a) 数组类型的参数绑定 b) List类型的绑定 ...

  2. spring 事务配置

    事务配置文档xml <!-- from the file 'context.xml' --> <?xml version="1.0" encoding=" ...

  3. 表单验证插件validate

    http://www.runoob.com/jquery/jquery-plugin-validate.html <!DOCTYPE html> <html lang="e ...

  4. java设计模式(四)代理模式

    适用于为不同操作添加共同的额外行为.通过代理对象访问目标对象,这样可以增加对目标对象的额外操作,达到扩展目标对象功能的目的,如spring事务.AOP等. 要点:1)抽象角色:通过接口或抽象类声明真实 ...

  5. [CodeChef-QTREE]Queries on tree again!

    题目大意: 给定一个环长为奇数的带权基环树,支持以下两种操作: 1.两点间最短路取反: 2.两点间最短路求最大子段和. 思路: 首先找出环,然后对每一个外向树轻重链剖分, 用线段树维护每一个区间的和. ...

  6. java多线程技术之(callable和future)

    接着上一篇继续并发包的学习,本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果. Callable接口类似于Runnable,从名字就可以看出来了,但是Runnab ...

  7. Codeforces Round #359 (Div. 2) A. Free Ice Cream 水题

    A. Free Ice Cream 题目连接: http://www.codeforces.com/contest/686/problem/A Description After their adve ...

  8. C# 高级编程9 第30章MEF C#可扩展编程之MEF第2章(抄录)

    Managed Extensibility Framework (MEF) 什么是 MEF?   Managed Extensibility Framework 即 MEF 是用于创建轻量.可扩展应用 ...

  9. Go语言Web框架gwk介绍 (五)

    Session Go的net/http本身不带session的机制,需要开发人员自行实现,gwk实现了内存中的session存储机制,如果需要将session存在其他地方比如redis或者memcac ...

  10. Node.js学习笔记(1) - Node.js简介

    近期在看一些Node.js的知识,看完后觉得,一些前面的东西忘记了,于是整理一下,方便自己查阅,也希望对学习Node.js的朋友有些帮助: 当然以下只是我个人的观点和理解,不喜勿喷,也望大神指教. 一 ...