美文网首页
KVO基本使用

KVO基本使用

作者: jetpon | 来源:发表于2019-01-05 10:10 被阅读0次

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

一、KVO基本使用

使用KVO,能够非常便捷的实现UI的更新。主要步骤分为三部分:
1.添加观察者
2.dealloc中移除观察者
3.增加回调方法

1.添加观察者

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

以上则为添加观察者的API。
observer:观察者(要观察属性变化的对象)
keyPath:要监听的属性
options:决定回调方法的回调时机以及返回的参数(后面会说)
context:可以用来传值,不过一般传nil即可

keyPath
可以是对象的直接的属性,比如_personage属性
当对象的某个属性为对象时,要监听对象属性其中的一个属性,比如person有个属性是dog(对象),现在要监听dogname属性,keyPath就可以写成dog.name

options

typedef NS_OPTIONS(NSUInteger, NSKeyValueObservingOptions) {
  //当值改变后只获取新值
    NSKeyValueObservingOptionNew = 0x01, 
  //值改变后只获取旧值
    NSKeyValueObservingOptionOld = 0x02, 
  //添加观察者后,立即触发一次
    NSKeyValueObservingOptionInitial API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0)) = 0x04, 
  //变化前触发一次,变化后触发一次
    NSKeyValueObservingOptionPrior API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0)) = 0x08
};

NSKeyValueObservingOptionNew、NSKeyValueObservingOptionOld影响值的获取

NSKeyValueObservingOptionInitial、NSKeyValueObservingOptionPrior影响回调的时机

根据需求,可以使用"|"进行组合使用

  1. NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld:触发时,同时返回新值以及旧值
  2. NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew:初始化时触发一次,并且返回新值
    ...
示例:
[_person addObserver:self forKeyPath:NSStringFromSelector(@selector(age)) options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:nil];

self表示所属的controller(例子中是在controller添加的观察者)
NSStringFromSelector(@selector(age))表示要监听的是_person对象的age属性,也可以直接写成@"age "
NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld表示为当值修改之后返回新值以及旧值

2.dealloc中移除观察者

注:添加和移除方法要一一对应,否则会导致crash

要在- (void)dealloc;中调用如下的api,移除观察者

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

observer:即为之前添加的观察者,在示例中即为self
keyPath: 即为之前添加的要观察的属性,在示例中即为age

示例:
- (void)dealloc {
    [_person removeObserver:self forKeyPath:@"age"];
}

3.增加回调方法

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

keyPath:即为要观察的属性
object :即为要观察的对象
context :即为添加观察者时赋的值

change:要观察的属性的值,是个字典可能会有四个key:oldnewkindnotificationIsPriornew表示新值所对应的key,old表示旧值所对应的key,notificationIsPrior 表示在值改变之前触发,kind表示回调触发的方式:

typedef NS_ENUM(NSUInteger, NSKeyValueChange) {
    NSKeyValueChangeSetting = 1, //设置
    NSKeyValueChangeInsertion = 2,//插入
    NSKeyValueChangeRemoval = 3,//移除
    NSKeyValueChangeReplacement = 4,//替换
};

change示例

{
    kind = 1;  //表明是设置时触发
    new = 1;//新值为1
    old = 0;//旧值为0
}

当添加观察者时,options设置为NSKeyValueObservingOptionPrior时,会出现键值对notificationIsPrior = 1,表示此次回调是在值修改之前触发的

{
    kind = 1;
    notificationIsPrior = 1;  //表明此次回调是值修改之前触发的
    old = 0;
}

先写到这里,有时间我会完成后面的两部分。

相关文章

  • KVO基本使用

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

  • KVO

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

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

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

  • iOS重学之KVO详解

    KVO的基本使用 基本使用 KVO:Key Value Observing(键值监听),用来监听某个对象属性值的改...

  • KVO底层实现原理

    KVO基本使用 KVO全名Key Value Observing,监听属性的改变。 首先来看一下KVO的基本用法。...

  • KVO和KVC的使用及原理解析

    一 KVO基本使用 二 KVO本质原理讲解及代码验证 三 KVC基本使用 四 KVC设值原理 五 KVC取值原理 ...

  • KVO相关知识以及底层实现

    一.KVO的基本使用 使用KVO分为三个步骤: 1.通过addObserver:(NSObject *)obser...

  • iOS-底层-KVO和KVC

    一. KVO 1. KVO的基本使用 KVO的全称是Key-Value Observing,俗称“键值监听”,可以...

  • iOS-KVO(二) 使用注意点

    iOS-KVO(一) 基本操作iOS-KVO(二) 使用注意点iOS-KVO(三) 窥探底层实现iOS-KVO(四...

  • iOS-KVO(三) 窥探底层实现

    iOS-KVO(一) 基本操作iOS-KVO(二) 使用注意点iOS-KVO(三) 窥探底层实现iOS-KVO(四...

网友评论

      本文标题:KVO基本使用

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