iOS--基于键值的观察者模式(KVO)
VO简而言之就是:基于键值的观察者,实际上就是观察者模式。
Cocoa Framework已经为我们提供了这一模式,不需要我们自己来实现了。我们只需要按照约定的方式去做就可以了。KVO主要用于用户界面交互,当多个View共同使用了同一个实体,当这个实体中的某个属性改变时,如果需要更新多个界面,KVO的作用就发挥出来了。
下面给出一个简单的示例,来展示如何使用KVO。
有两种方式可以在键值改变的时候给观察者发送通知:自动方式和手动方式。其中自动方式是由NSObject提供的一个默认实现,通常情况下,如果你自定义了一个类是从NSObject继承而来,那么该类就已经具有了KVO的自动通知功能,而且不需要额外的编写代码。如果需要手动控制通知方式,那么需要重写automaticallyNotifiesObserversForKey:方法。在该方法中如果需要手动控制通知方式,则将automaticallyNotifiesObserversForKey:返回NO,否则返回YES。
下面的例子是将openingBalance属性设置为手动通知方式,其他属性默认为自动通知方式
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey {2
BOOL automatic = NO;3
if ([theKey isEqualToString:@"openingBalance"]) {4
automatic = NO;5
} else {6
automatic=[super automaticallyNotifiesObserversForKey:theKey];7
}8
return automatic;9
}10

11

12

手动通知方式的好处在于可以减少不必要的通知,比如你可以首先检测一下该属性值是否发生改变,如果发生改变则通知,否则不通知,代码示例如下:
- (void)setOpeningBalance:(double)theBalance {2

3
if (theBalance != openingBalance) {4

5
[self willChangeValueForKey:@"openingBalance"];6

7
openingBalance=theBalance;8

9
[self didChangeValueForKey:@"openingBalance"];10

11
}12

13
}14

15

如果一个单一的操作引发了多个属性值的改变,那么就必须嵌套改变通知。代码示例如下:
- (void)setOpeningBalance:(double)theBalance {2

3
[self willChangeValueForKey:@"openingBalance"];4

5
[self willChangeValueForKey:@"itemChanged"];6

7
openingBalance=theBalance;8

9
itemChanged=itemChanged+1;10

11
[self didChangeValueForKey:@"itemChanged"];12

13
[self didChangeValueForKey:@"openingBalance"];14

15
} iOS--基于键值的观察者模式(KVO)的更多相关文章
- ios中键值编码kvc和键值监听kvo的特性及详解
总结: kvc键值编码 1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性) 2. 如果方法属性的关键字和需要数据中的关键字相同的话 ...
- iOS监听模式系列之键值编码KVC、键值监听KVO的简单介绍和应用
键值编码KVC 我们知道在C#中可以通过反射读写一个对象的属性,有时候这种方式特别方便,因为你可以利用字符串的方式去动态控制一个对象.其实由于ObjC的语言特性,你根部不必进行任何操作就可以进行属性的 ...
- [深入浅出Cocoa]详解键值观察(KVO)及其实现机理
一,前言 Objective-C 中的键(key)-值(value)观察(KVO)并不是什么新鲜事物,它来源于设计模式中的观察者模式,其基本思想就是: 一个目标对象管理所有依赖于它的观察者对象,并在它 ...
- 09 (OC)* 键路径(keyPath)、键值编码(KVC)、键值观察(KVO)
键路径在一个给定的实体中,同一个属性的所有值具有相同的数据类型.键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一 ...
- iOS - KVC 键值编码
1.KVC KVC 是 Key-Value Coding 的简写,是键值编码的意思,属于 runtime 方法.Key Value Coding 是 cocoa 的一个标准组成部分,是间接给对象属性设 ...
- 路径(keyPath)、键值编码(KVC)和键值观察(KVO)
键路径 在一个给定的实体中,同一个属性的所有值具有相同的数据类型. 键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接 ...
- C# 利用键值对取代Switch...Case语句
swich....case 条件分支多了之后,会严重的破坏程序的美观性. 比如这个 上述代码是用于两个进程之间通信的代码,由于通信的枚举特别的多,所以case的分支特别的多.导致了代码的可读性,可维护 ...
- iOS - KVO 键值观察
1.KVO KVO 是 Key-Value Observing 的简写,是键值观察的意思,属于 runtime 方法.Key Value Observing 顾名思义就是一种 observer 模式用 ...
- iOS中 KVO 键值观察者
KVO Key-Value-Obsever 键值观察者 1.首先要有一个观察者,此时被观察者是自己找一个观察者观察自己的key值对应的value值有没有改变,如果改变了就可以做一些响应的操作 创建一个 ...
随机推荐
- 初中级PHP面试基础汇总
这是我整理的一套面试题,老铁们看看就当复习了哦 相关PHP面试题 搞定PHP面试 - 函数知识点整理 php 面试题目整理 PHP面试整理 PHP面试 概述 感觉现在发面试题有些冷门,就跟昨天德国那场 ...
- element使用心得
Table Table 常用属性解释 数据过滤,filter过滤器 <el-table-column width="200" show-overflow-tooltip la ...
- 《linux设备驱动开发详解》笔记——11内存与IO访问
内存访问与映射是linux驱动常见操作,操作硬件时离不开内存的映射,本章比较重要. 11.1 CPU与内存.I/O 目前的嵌入式处理器,都不提供专门的I/O空间,而仅存在内存空间:各种外设寄存器都直接 ...
- VS搭建一个WEB的简历第二天,,,最终目标写个好看的简历,再搭建一个自己脑海的网页
VS做简历的第二天 第二天吸取了第一天的教训写的代码 第一天写的代码https://www.cnblogs.com/pythonywy/p/10816215.html,写了一堆错误T T 非常感谢Li ...
- LeetCode(202) Happy Number
题目 Write an algorithm to determine if a number is "happy". A happy number is a number defi ...
- ecplise建立模拟器,安装apk文件
方法一,把所要安装的apk,例xxx.apk拷贝到sdk下的adb的路径下,也就是和adb在同一个文件夹,比如我的是D:\Program Files\Android\sdk\platform-tool ...
- webforms字典参数处理
当webforms参数中的value是一个字典时,加上‘’即可正常传参.
- WordPress的编译器功能扩展
//php代码如下://向文章编辑器的Visual区添加自定义按钮,js文件存放在wp-content/plugins/文件夹下 add_action('admin_head', 'my_custom ...
- BZOJ 2720 [Violet 5]列队春游 ——期望DP
很喵的一道题(我可不是因为看了YOUSIKI的题解才变成这样的) $ans=\sum_{x<=n}\sum_{i<=n} iP(L=i)$ 其中P(x)表示视线为x的概率. 所以只需要求出 ...
- 洛谷 [P2148] E&G
SG函数的应用 首先每一组都是独立的,所以我们可以求出每一组的SG值异或出来. 那么怎么求每一组的SG值呢,网上的题解都是打表找规律,但其实这个规律是可以证明的 先看规律: x为奇数,y为奇数:SG= ...