KVO:(Key-Value-Observer)键值观察者,是观察者设计模式的一种具体实现

KVO触发机制:一个对象(观察者),监测另一对象(被观察者)的某属性是否发生变化,若被监测的属性发生的更改,会触发观察者的一个方法(方法名固定,类似代理方法)

KVO使用步骤:

1、注册观察者(为被观察者指定观察者以及被观察属性)


2、实现回调方法


3、触发回调方法(被观察属性发生更改)

4、移除观察者

 #import "ViewController.h"

 @interface ViewController ()
/// 观察可变数组的改变情况(苹果官方文档不建议对数组进行观察)
@property (nonatomic, strong) NSMutableArray *array;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
/**
* KVO 键值观察 是观察者设计模式
*/
// 初始化数组
self.array = [NSMutableArray array];
self.array = [@[@""] mutableCopy];
// 1、注册观察者
// 参数1: 指注册 KVO 通知的对象。观察者必须实现 observeValueForKeyPath:ofObject:change:context: 以对被观察对象的改变做出响应。
// 参数2:指相对于被观察者的属性,此值必须不能为 nil。
// 参数3:定义的常量值的组合,这些值指定了在发出的观察通知中会包含哪些东西。不同的指定值会导致观察通知中包含的值不同。
/**
NSKeyValueObservingOptionNew 表示 change 字典中应该包含监听对象的新属性值
NSKeyValueObservingOptionOld 表示 change 字典中应该包含监听对象的旧属性值,即改变前的值
NSKeyValueObservingOptionInitial 如果设定了该值,在注册观察者的方法返回之前就会发送通知给观察者
NSKeyValueObservingOptionPrior 使得被观察对象的值在改变之前和改变之后都会发送通知,而不仅仅是在改变之后发送一个通知
*/
// 参数4:该值可以是任一数据值,会在 observeValueForKeyPath:ofObject:change:context: 中传递给 anObserver,也就是这个参数值与 observeValueForKeyPath:ofObject:change:context: 的 context 参数的值相等
[self addObserver:self forKeyPath:@"array" options:NSKeyValueObservingOptionNew context:nil];
} // 2、实现回调方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
// 可以进行刷新UI的操作
// keyPath 指相对于被监听对象 object 的键路径
// object 指键路径 keyPath 所属对象,即被监听对象
// change 描述被监听属性的变化信息
// context 注册 KVO 时由监听者提供,见上面关于context 的描述
NSLog(@"keyPath = %@", keyPath);
NSLog(@"object = %@", object);
NSLog(@"change = %@", change);
} // 3、触发可变数组进行改变
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSArray *subArray = @[@"", @"", @""];
// 根据keyPath获取到可变数组对象
// setArray 给可变数组对象设置数据
[[self mutableArrayValueForKeyPath:@"array"] setArray:subArray];
NSLog(@"========%@", self.array);
} // 视图将要消失
- (void)viewWillDisappear:(BOOL)animated {
// 移除观察者
[self removeObserver:self forKeyPath:@"array"];
} @end

参考博客:http://blog.csdn.net/CaryaLiu/article/details/49256477#comments

UI进阶 KVO的更多相关文章

  1. UI进阶 科大讯飞(2) 语音合成(文字转换成语音)

    科大讯飞开放平台.SDK下载.添加静态库.初始化见UI进阶 科大讯飞(1) 语音听写(语音转换成文字) 实现语音合成 功能实现步骤: 导入头文件 创建文字识别对象 指定文字识别后的回调代理对象 开启文 ...

  2. android UI进阶之用【转】

    android UI进阶之用ViewPager实现欢迎引导页面 摘要: ViewPager需要android-support-v4.jar这个包的支持,来自google提供的一个附加包.大家搜下即可. ...

  3. UI进阶 即时通讯之XMPP好友列表、添加好友、获取会话内容、简单聊天

    这篇博客的代码是直接在上篇博客的基础上增加的,先给出部分代码,最后会给出能实现简单功能的完整代码. UI进阶 即时通讯之XMPP登录.注册 1.好友列表 初始化好友花名册 #pragma mark - ...

  4. iOS开发——UI进阶篇(五)通知、代理、kvo的应用和对比,购物车

    一.通知 1.通知中心(NSNotificationCenter)每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信任何一个对象都可以向 ...

  5. UI进阶

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  6. iOS开发——UI进阶篇(十五)Quartz2D介绍

    一.Quartz2D简介 1.什么是Quartz2DQuartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作绘制图形 : 线条\三角形\矩形\圆\弧等绘制文字绘 ...

  7. iOS开发——UI进阶篇(九)block的巧用

    前面有提到通知.代理.kvo等方法来协助不同对象之间的消息通信,今天再介绍一下用block来解决这个问题 接着前面的例子 这里将功能在复述一遍 我把用block和通知放在一起比较,当然代理和kvo如何 ...

  8. iOS开发——UI进阶篇(七)程序启动原理、打电话、发短信

    一.Info.plist常见的设置 1.建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 ...

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

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

随机推荐

  1. bzoj2875: [Noi2012]随机数生成器

    矩阵乘法. x[n] = {x[0],1} * ( {a,0} ^ n ) {b,1} 写成这样谁能看懂.... noi里的大水题.我居然 #include<cstdio> #includ ...

  2. Discuz 7.2 /faq.php SQL注入漏洞

    测试方法: 提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负!   Discuz 7.2 /faq.php SQL注入漏洞   http://www.xxx.com/faq.php?a ...

  3. python - 简述list. extend() 和 append() 区别

    >>> a = 'hello' >>> b = [1, 2, 3] >>> b.append(a) >>> b [1, 2, 3 ...

  4. 【C#学习笔记】载入图片并居中

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. 海康、大华IpCamera RTSP地址和格式

    海康:rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream说明:username: 用户名.例如 ...

  6. 数据库语言(一):SQL语法实例整理

    数据库系统以一些语句作为输入,并返回一些输出,例如sql查询总是返回一张表,我们定义:具有相同格式的记录的集合是一张表. 考虑大学数据库系统: SQL中的数据类型: char(n) 字符串长度为n   ...

  7. <三>面向对象分析之UML核心元素之参与者

    一:版型        --->在UML里有一个概念叫版型.有些书里也称类型,构造型.        --->这个概念是对一个UML元素基础定义的扩展.在同一个元素基础定义的基础上赋予特别 ...

  8. Mybatis学习——一对多关联表查询

    1.实体类 public class Student { private int id; private String name; } public class Classes { private i ...

  9. 【转】Windows环境下Android Studio v1.0安装教程

    原文网址:http://ask.android-studio.org/?/article/9 http://android-studio.org/index.php/docs/experience/1 ...

  10. iOS - 操作文件目录的方法

    转:http://blog.csdn.net/marujunyy/article/details/11579183 使用目录的常用方法: //获取当前目录 - (NSString *)currentD ...