VO简而言之就是:基于键值的观察者,实际上就是观察者模式。

Cocoa Framework已经为我们提供了这一模式,不需要我们自己来实现了。我们只需要按照约定的方式去做就可以了。KVO主要用于用户界面交互,当多个View共同使用了同一个实体,当这个实体中的某个属性改变时,如果需要更新多个界面,KVO的作用就发挥出来了。

下面给出一个简单的示例,来展示如何使用KVO。

示例下载

有两种方式可以在键值改变的时候给观察者发送通知:自动方式和手动方式。其中自动方式是由NSObject提供的一个默认实现,通常情况下,如果你自定义了一个类是从NSObject继承而来,那么该类就已经具有了KVO的自动通知功能,而且不需要额外的编写代码。如果需要手动控制通知方式,那么需要重写automaticallyNotifiesObserversForKey:方法。在该方法中如果需要手动控制通知方式,则将automaticallyNotifiesObserversForKey:返回NO,否则返回YES。

下面的例子是将openingBalance属性设置为手动通知方式,其他属性默认为自动通知方式

 1+ (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

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

 1- (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

如果一个单一的操作引发了多个属性值的改变,那么就必须嵌套改变通知。代码示例如下:

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

  1. ios中键值编码kvc和键值监听kvo的特性及详解

    总结: kvc键值编码  1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性)           2. 如果方法属性的关键字和需要数据中的关键字相同的话                  ...

  2. iOS监听模式系列之键值编码KVC、键值监听KVO的简单介绍和应用

    键值编码KVC 我们知道在C#中可以通过反射读写一个对象的属性,有时候这种方式特别方便,因为你可以利用字符串的方式去动态控制一个对象.其实由于ObjC的语言特性,你根部不必进行任何操作就可以进行属性的 ...

  3. [深入浅出Cocoa]详解键值观察(KVO)及其实现机理

    一,前言 Objective-C 中的键(key)-值(value)观察(KVO)并不是什么新鲜事物,它来源于设计模式中的观察者模式,其基本思想就是: 一个目标对象管理所有依赖于它的观察者对象,并在它 ...

  4. 09 (OC)* 键路径(keyPath)、键值编码(KVC)、键值观察(KVO)

    键路径在一个给定的实体中,同一个属性的所有值具有相同的数据类型.键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一 ...

  5. iOS - KVC 键值编码

    1.KVC KVC 是 Key-Value Coding 的简写,是键值编码的意思,属于 runtime 方法.Key Value Coding 是 cocoa 的一个标准组成部分,是间接给对象属性设 ...

  6. 路径(keyPath)、键值编码(KVC)和键值观察(KVO)

    键路径 在一个给定的实体中,同一个属性的所有值具有相同的数据类型. 键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接 ...

  7. C# 利用键值对取代Switch...Case语句

    swich....case 条件分支多了之后,会严重的破坏程序的美观性. 比如这个 上述代码是用于两个进程之间通信的代码,由于通信的枚举特别的多,所以case的分支特别的多.导致了代码的可读性,可维护 ...

  8. iOS - KVO 键值观察

    1.KVO KVO 是 Key-Value Observing 的简写,是键值观察的意思,属于 runtime 方法.Key Value Observing 顾名思义就是一种 observer 模式用 ...

  9. iOS中 KVO 键值观察者

    KVO Key-Value-Obsever 键值观察者 1.首先要有一个观察者,此时被观察者是自己找一个观察者观察自己的key值对应的value值有没有改变,如果改变了就可以做一些响应的操作 创建一个 ...

随机推荐

  1. 初中级PHP面试基础汇总

    这是我整理的一套面试题,老铁们看看就当复习了哦 相关PHP面试题 搞定PHP面试 - 函数知识点整理 php 面试题目整理 PHP面试整理 PHP面试 概述 感觉现在发面试题有些冷门,就跟昨天德国那场 ...

  2. element使用心得

    Table Table 常用属性解释 数据过滤,filter过滤器 <el-table-column width="200" show-overflow-tooltip la ...

  3. 《linux设备驱动开发详解》笔记——11内存与IO访问

    内存访问与映射是linux驱动常见操作,操作硬件时离不开内存的映射,本章比较重要. 11.1 CPU与内存.I/O 目前的嵌入式处理器,都不提供专门的I/O空间,而仅存在内存空间:各种外设寄存器都直接 ...

  4. VS搭建一个WEB的简历第二天,,,最终目标写个好看的简历,再搭建一个自己脑海的网页

    VS做简历的第二天 第二天吸取了第一天的教训写的代码 第一天写的代码https://www.cnblogs.com/pythonywy/p/10816215.html,写了一堆错误T T 非常感谢Li ...

  5. LeetCode(202) Happy Number

    题目 Write an algorithm to determine if a number is "happy". A happy number is a number defi ...

  6. ecplise建立模拟器,安装apk文件

    方法一,把所要安装的apk,例xxx.apk拷贝到sdk下的adb的路径下,也就是和adb在同一个文件夹,比如我的是D:\Program Files\Android\sdk\platform-tool ...

  7. webforms字典参数处理

    当webforms参数中的value是一个字典时,加上‘’即可正常传参.

  8. WordPress的编译器功能扩展

    //php代码如下://向文章编辑器的Visual区添加自定义按钮,js文件存放在wp-content/plugins/文件夹下 add_action('admin_head', 'my_custom ...

  9. BZOJ 2720 [Violet 5]列队春游 ——期望DP

    很喵的一道题(我可不是因为看了YOUSIKI的题解才变成这样的) $ans=\sum_{x<=n}\sum_{i<=n} iP(L=i)$ 其中P(x)表示视线为x的概率. 所以只需要求出 ...

  10. 洛谷 [P2148] E&G

    SG函数的应用 首先每一组都是独立的,所以我们可以求出每一组的SG值异或出来. 那么怎么求每一组的SG值呢,网上的题解都是打表找规律,但其实这个规律是可以证明的 先看规律: x为奇数,y为奇数:SG= ...