KVO之KVOController学习

废话不多说开撸。。。

首先看下这个第三方的文件目录结构,可以看到结构非常简单,一个是NSObject的分类,一个就是观察者的具体实现。

KVO之KVOController学习_第1张图片

先看下NSObject的分类吧,其实里面很简单,就是为NSObject添加了2个属性KVOController和KVOControllerNonRetaining,KVOController是持有的属性,KVOControllerNonRetaining是不持有的

KVO之KVOController学习_第2张图片

实现文件就是利用RunTime动态关联到NSObject类中,只是两者的初始化方式有一点不同而已

KVO之KVOController学习_第3张图片

可以看到[FBKVOController controllerWithObserver:self]调用的方法就是[[FBKVOController alloc] initWithObserver:self retainObserved:NO],只是他们传的Bool值不一样

KVO之KVOController学习_第4张图片

下面看下FBKVOController.h中都有那些公开的方法,这些都是初始化方法,其中init和new不可达,也就是假如你用这两个方法初始化这个类的话就会报错,这里用的是系统的两个宏NS_DESIGNATED_INITIALIZER、NS_UNAVAILABLE

KVO之KVOController学习_第5张图片

可以看到注册观察者有六种方法和三种移除观察者的方法,其中注册观察者的方法前3种是观察一个属性,后三种则可以观察多个属性

KVO之KVOController学习_第6张图片

看完.h在看下.m,先看下.h中的6个注册观察者的方法和3个移除观察者的方法。第一个方法前面先去判断keyPath、object、block如果为空就结束。又去初始化一个_FBKVOInfo对象,之后调用[self _observe:object info:info]。第二个方法就是循环调用第一个方法,后面的4个观察者方法和前两个方法一样。

KVO之KVOController学习_第7张图片

移除观察者方法实际调用如下

KVO之KVOController学习_第8张图片

接着往下看,这个方法主要有,把info和object存入_objectInfosMap,然后调用[[_FBKVOSharedController sharedController] observe:object info:info];

KVO之KVOController学习_第9张图片

再看下移除观察者。移除_objectInfosMap中的object,然后调用[[_FBKVOSharedController sharedController] unobserve:object info:registeredInfo],看到这大家可以看出所有的核心操作都是在_FBKVOSharedController这个类中

KVO之KVOController学习_第10张图片

然后看下_FBKVOSharedController这个类。实际调用系统观察者的就是这个函数,

KVO之KVOController学习_第11张图片

系统的函数- (void)observeValueForKeyPath:(nullable NSString *)keyPath                      ofObject:(nullable id)object change:(nullable NSDictionary*)change context:(nullable void *)context再去调用我们声明的方法

KVO之KVOController学习_第12张图片

移除观察者方法也比较简单,一目了然

KVO之KVOController学习_第13张图片

至此已经分析完毕,总结一下,FBKVOController类中其实包含3个类FBKVOController、_FBKVOInfo、_FBKVOSharedController。我们调用的观察者方法就是FBKVOController类中公开声明的,而_FBKVOInfo类相当于储存数据的一个类,类似于model,而实际调用系统的观察者方法的是_FBKVOSharedController,然后再分发给FBKVOController。

其实这个库中还有很多小的细节问题,下面几篇会写一下关于这个库中的细节描述。。。。

你可能感兴趣的:(KVO之KVOController学习)