iOS--基于键值的观察者模式(KVO)
VO简而言之就是:基于键值的观察者,实际上就是观察者模式。
Cocoa Framework已经为我们提供了这一模式,不需要我们自己来实现了。我们只需要按照约定的方式去做就可以了。KVO主要用于用户界面交互,当多个View共同使用了同一个实体,当这个实体中的某个属性改变时,如果需要更新多个界面,KVO的作用就发挥出来了。
下面给出一个简单的示例,来展示如何使用KVO。
有两种方式可以在键值改变的时候给观察者发送通知:自动方式和手动方式。其中自动方式是由NSObject提供的一个默认实现,通常情况下,如果你自定义了一个类是从NSObject继承而来,那么该类就已经具有了KVO的自动通知功能,而且不需要额外的编写代码。如果需要手动控制通知方式,那么需要重写automaticallyNotifiesObserversForKey:方法。在该方法中如果需要手动控制通知方式,则将automaticallyNotifiesObserversForKey:返回NO,否则返回YES。
下面的例子是将openingBalance属性设置为手动通知方式,其他属性默认为自动通知方式
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
手动通知方式的好处在于可以减少不必要的通知,比如你可以首先检测一下该属性值是否发生改变,如果发生改变则通知,否则不通知,代码示例如下:
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
如果一个单一的操作引发了多个属性值的改变,那么就必须嵌套改变通知。代码示例如下:
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值有没有改变,如果改变了就可以做一些响应的操作 创建一个 ...
随机推荐
- x220 OS X 10.10.4安装
变色龙安装过程: 1.使用磁盘助手将按照盘写入独立的磁盘分区(AF格式,就是Apple的HPS格式): 2.安装启动时,用-v -f -x参数,分别为显示信息.重新build系统驱动.安全模式: 3. ...
- sessionStorage 的数据会在同一网站的多个标签页之间共享吗?这取决于标签页如何打开
一直以来,我所以为的 sessionStorage 的生命周期是这样的:在 sessionStorage 中存储的数据会在当前浏览器的同一网站的多个标签页中共享,并在此网站的最后一个标签页被关闭后清除 ...
- React初识整理(五)--Redux和Flux(解决状态传递问题)
Flux 1.引入:在React的应⽤中,状态管理是⼀个⾮常重要的⼯作.我们不会直接对DOM节点进⾏操作,⽽是通过将数据设置给state,由state来同步UI,这种⽅式有个潜在的问题,每个组件都有独 ...
- 《c++编程思想》关于虚函数在构造函数行为的理解,理解有误,望告知!
<c++编程思想>书上有一段话:在任何构造函数中,可能只是部分形成对象——我们只能知道基类已被初始化,但并不知道哪个类是从这个基类继承来的.然而,虚函数在继承层次上是“向前”和“向外”进行 ...
- 【线段树 集合hash】bzoj4373: 算术天才⑨与等差数列
hash大法好(@ARZhu):大数相乘及时取模真的是件麻烦事情 Description 算术天才⑨非常喜欢和等差数列玩耍.有一天,他给了你一个长度为n的序列,其中第i个数为a[i].他想考考你,每次 ...
- 浮动的label
在web项目中,有一个很重的模块就是登陆/注册模块,这个模块的主体部分就是一个form表单,这个form表单包含两个重要input组(用户名/密码),每个input组都包含label和input,而关 ...
- web前端常用的封装方法
1.放大镜 //页面加载完毕后执行 window.onload = function () { var oDemo = document.getElementById('demo'); var oMa ...
- HTML 文件类表单元素如何限制上传类型,Accept属性设置
需求描述:简单的控制file的选择类型 解决方法:使用HTML input file 的accept属性控制 实例: <form action="demo_form.asp" ...
- 基础训练 Huffuman树
Huffuman树 /*解法一*/ #include<iostream> #include<queue> using namespace std; int main(){ pr ...
- Oracle排错总结
一.Oracle常规恢复之不安全恢复 http://www.cnblogs.com/jyzhao/p/4723994.html#2.11