KVO

作者: 移动端_小刚哥 | 来源:发表于2018-01-18 16:48 被阅读8次

键值观察KVO(Key-Value Observing)是一种允许通知对象--其他对象的制定属性已经作出更改--的机制。主要用到NSKeyValueObserving类

要使用KVO,必须确保所观察的对象符合KVO标准,通常情况下,如果所创建的对象继承自NSObject并且以常规方式创建属性,那么该对象及其属性将自动符合KVO标准。

使用步骤

1、注册观察对象

  - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;

  • observer:观察者,观察者通过上面方法发送消息向观察者对象进行注册,并将自身作为参数传递给被观察对象

  • keyPath:被观察对象的属性路径

  • options:观察选项,是一个枚举类型NSKeyValueObservingOptions

    1. NSKeyValueObservingOptionNew:接收到的数据字典中包含NSKeyValueChangeNewKey键,对应的值为属性发生改变后的新值
    2. NSKeyValueObservingOptionOld:接收到的数据字典中包含NSKeyValueObservingOptionOld键,对应的值为属性发生改变前的旧值
    3. NSKeyValueObservingOptionInitial:会在注册的时候使观察方法调用一次
    4. NSKeyValueObservingOptionPrior:会在观察属性值改变的前后均调用一次。其中在变化前调用的一次时NSKeyValueObservingOptionNew对应的值为NULL,NSKeyValueObservingOptionOld对应的值为变化前的值
  • context:相关联的上下文,该参数可以设置为NULL并完全依赖关键路径字符串(keyPath)来确定更改通知的来源,但是如果该类的父类也观察相同keyPath,那么这里设为NULL可能会出问题。更安全和可扩展的方法是使用上下文来确保收到的通知是正确的观察者

官方文档示例:使用静态变量的地址作为上下文内容
static void * PersonAccountBalanceContext =&PersonAccountBalanceContext; static void * PersonAccountInterestRateContext =&PersonAccountInterestRateContext;

2、实现检测的方法

- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary<NSKeyValueChangeKey, id> *)change context:(nullable void *)context;

当被观察对象属性值发生变化时,观察者会收到一条消息。观察者必须实现这个方法,在该方法中可以通过keyPath或者context去判断数据来源,若要取出change字典里的值要使用下面枚举定义的key

  • NSKeyValueChangeKindKey:属性改变的类型,change中会永远包含的键,对应的值为NSUInteger类型,系统定义了一个枚举类型与之对应。

    1. NSKeyValueChangeSetting = 1 由于设置新值造成的改变
    2. NSKeyValueChangeInsertion = 2 由于在集合中插入元素造成的改变
    3. NSKeyValueChangeRemoval = 3 由于在集合中移除元素造成的改变
    4. NSKeyValueChangeReplacement = 4 由于在集合中发生替换元素造成的改变
  • NSKeyValueChangeNewKey:只有在注册观察者的时候在optional参数中加入NSKeyValueObservingOptionNew时才会被change参数包括,获取改变后的新值

  • NSKeyValueChangeOldKey:只有在注册观察者的时候在optional参数中加入NSKeyValueObservingOptionOld时才会被change参数包括,获取改变前的旧值

  • NSKeyValueChangeIndexesKey:只有当被观察对象属性是集合的情况下,这个键值才会被change参数包含,获取集合中改变的元素的index,NSIndexSet类型

  • NSKeyValueChangeNotificationIsPriorKey:只有当注册观察者的时候在optional参数中加入NSKeyValueObservingOptionPrior时,这个键值才会被change参数包含,NSNumber类型

3、移除观察者

  - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(nullable void *)context / - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;

观察者在释放时不能主动释放自己,被观察对象还可以继续发送消息给观察者,但是如果观察者已经释放掉,这个时候会触发内存访问异常,所以一定要在观察者被释放之前移除观察者。常见的模式是在viewDidLoad注册为观察者,在dealloc注销观察者。

相关文档
原文地址

相关文章

  • iOS原理篇(一): KVO实现原理

    KVO实现原理 什么是 KVO KVO 基本使用 KVO 的本质 总结 一 、 什么是KVO KVO(Key-Va...

  • 04. KVO使用,原理,本质

    问题 KVO日常使用 KVO原理(KVO本质是什么) 如何手动触发KVO 直接修改成员变量会触发KVO吗 KVO图...

  • 20.iOS底层学习之KVO 原理

    本篇提纲1、KVO简介;2、KVO的使用;3、KVO的一些细节;4、KVO的底层原理; KVO简介 KVO全称Ke...

  • 深入理解KVO

    iOS | KVO | Objective-C KVO的本质是什么,如何手动触发KVO? 1.什么是KVO KVO...

  • OC语法:KVO的底层实现

    一、KVO是什么二、怎么使用KVO三、KVO的底层实现四、KVO常见面试题 一、KVO是什么 KVO全称Key-V...

  • KVO基本使用

    分三部分解释KVO一.KVO基本使用二.KVO原理解析三.自定义实现KVO 一、KVO基本使用 使用KVO,能够非...

  • KVO 解析

    KVO解析(一) —— 基本了解KVO解析(二) —— 一个简单的KVO实现KVO解析(三) —— KVO合规性K...

  • KVO

    目录 1. KVO的使用1.1 KVO基本使用方法1.2 KVO手动触发模式1.3 KVO属性依赖1.4 KVO容...

  • OC语言之KVO与KVC

    KVO 什么是KVO? KVO 是 Key-value observing(键值观察)的缩写。 KVO是Objec...

  • 可能碰到的iOS笔试面试题(7)--KVO-KVC

    KVC-KVO KVC的底层实现? KVO的底层实现? 什么是KVO和KVC? KVO的缺陷? KVO是一个对象能...

网友评论

      本文标题:KVO

      本文链接:https://www.haomeiwen.com/subject/ugkwoxtx.html