iOS-KVO基本使用和底层实现原理

KVO定义

KVO属于观察者模式,这种设计在很多地方都能用到,比如我们的响应式编程,代表框架RAC等.
键值观察是一种机制,当指定对象属性改变的时候允许另一对象接受通知.

KVO基本使用

使用KVO分为三个步骤:

  1. 通过addObserver: forKeyPath: options:context:方法添加观察者,观察者可以接受keyPath属性的变化事件.
  2. 在观察者中实现observeValueForKeyPath:ofObject: change: context:方法,当keyPath属性发生变化时,KVO会回调这个方法来通知观察者.
  3. 当观察者不需要监听时,可以调用removeObserver:forKeyPath:方法将KVO移除,需要注意的是,调用removeObserver需要在观察者消失之前,否则会导致Crash.
    代码如下图所示
    代码图.png
    002.png

003.png

KVO触发模式

KVO在属性发生改变时的调用是自动的,如果想手动控制这个调用时机,或者想自己实现KVO属性的调用,则可以通多KVO提供的方法进行调用.
废话不多说直接上代码!!

1
2
3
4
5
6
@implementation Person

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key
{
return NO;
}

如果返回NO通知就不会被触发,系统默认是自动调用触发通知的.
注意:这里我们可以通过Key值来修改,否则整个类的属性都变成手动的了!!

1
2
3
4
5
6
7
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key
{
if ([key isEqualToString:@"name"]) {
return NO;
}
return YES;
}

运行!! 这个时候点击是没有反应的,需要我们手动的去触发.
手动触发.png
加上这两句就OK了,这样我们的选择机会更多,有的时候我们只有在特定条件下需要通知观察者对吧!!

KVO属性依赖

Snip20181108_8.png

Snip20181108_10.png

Snip20181108_11.png

Snip20181108_12.png
这样我们就可以实现观察多个属性值了.

KVO原理探究

Snip20181109_1.png

Snip20181109_2.png

Snip20181109_3.png

Snip20181109_4.png

自定义KVO

Snip20181109_5.png

Snip20181109_6.png

Snip20181109_7.png
这样就实现了自定义KVO.

KVO对容器类的监听

有时候我们需要对对象里面的数组或者其他容器类监听 我们需要怎么做呢
如下所示
Snip20181109_8.png

Snip20181109_9.png

Snip20181109_10.png

至此,我们已经完成KVO的基本使用,底层原理,自定义等内容,不足之处希望大佬指点,如果你感觉还不错,顺手点个赞,谢谢!
转载请注明出处!