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值有没有改变,如果改变了就可以做一些响应的操作 创建一个 ...
随机推荐
- hihoCode-1043-完全背包
我们定义:best(i,x)代表i件以前的物品已经决定好选择多少件,并且在剩余奖券x的情况下的最优解. 我们可以考虑最后一步,是否再次选择i物品,在不超过持有奖券总额的情况下.上面的第二个式子的k是大 ...
- GIMP语言设置
初学GIMP,需要设置语言:点击 编辑 - 首选项 其他的配置如: 配置快捷键 自己熟悉吧!
- shell-code-3-echo用法&printf用法
××××××××××××××××××××××××××××××下面是echo××××××××××××××××××××××××××××××× # read 命令从标准输入(即执行时,键盘的输入)中读取一行 ...
- GYM 101350 G
G. Snake Rana time limit per test 4.0 s memory limit per test 256 MB input standard input output sta ...
- Luogu 3423 [POI 2005]BAN-银行票据 (多重背包单调队列优化 + 方案打印)
题意: 给出 n 种纸币的面值以及数量,求最少使用多少张纸币能凑成 M 的面额. 细节: 好像是要输出方案,看来很是头疼啊. 分析: 多重背包,裸体??? 咳咳,好吧需要低调,状态就出来了: dp [ ...
- mysql slow 分析工具
慢查询有什么用? 它能记录下所有执行超过long_query_time时间的SQL语句,帮你找到执行慢的SQL,方便我们对这些SQL进行优化. 测试用 MySQL 版本. Serv ...
- 【LeetCode】Maximum Subarray(最大子序和)
这道题是LeetCode里的第53道题. 题目描述: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1 ...
- EasyUI combogrid 赋多个值
var values = []; for (var i = 0; i < rows.length; i++) { if (rows[i].id>0 ) { values.push('' + ...
- 数组dome
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- arc和mrc混用
arc项目中引用非arc代码 加上“-fno-objc-arc” 非arc项目中引用arc代码 加上“-fobjc-arc”