源码
KVO一种非常有用的技术,用于在模型-视图-控制器应用程序中的层之间进行通信,FBKVOController在系统的KVO的基础上做了一层封装,它提供了一个简单、现代的API,也是线程安全的。好处包括
- 使用了block回调,自定义actions,原有的NSKeyValueObserving 回调
- 实现了自动移除observer,无需开发则手动移除
- 线程安全
- 使用block的形式,是代码更加集中。
API使用
第一步:先定义一个中介者,kvo控制器, 第二步:添加观察
- (FBKVOController *)kvoCtrl{
if (!_kvoCtrl) {
_kvoCtrl = [FBKVOController controllerWithObserver:self];
}
return _kvoCtrl;
}
[self.kvoCtrl observe:self.person keyPath:@"name" options:(NSKeyValueObservingOptionNew) block:^(id _Nullable** observer, id _Nonnull object, NSDictionary<NSString *,id> * _Nonnull change) {
NSLog(@"%@",change);
}];
源码分析
中介者初始化方法:
FBKVOController controllerWithObserver:self]
- 弱引用持有self
- 初始化一个
NSMapTable表,这个表主要存储了object和kvo infos对应的信息
添加观察者
下面以block的这种方式为例,其他的几种方式流程一样
- 先创建一个
_FBKVOInfo实例,让后判断objectInfosMap之前是否存在,这个info实例,如果不存在则添加进去
2.单列注册系统的observer
[[_FBKVOSharedController sharedController] observe:object info:info]
其中做了一些状态的判断,如果状态为没有注册,就会移除。
回调处理
在系统的方法里面做如下处理:
如果是
block方式,则block回调,如果是自定义actions,则调用自定义的action,如果实现了系统的回调方法,则调用系统的。
移除观察
vc 持有 FBKVOController 对象,vc控制释放的时候会调用vc的dealloc,也会调用,FBKVOController 对象的dealloc,如果在这个里面移除观察者,这不需要在每个控制器里面移除。
- (void)dealloc
{
[self unobserveAll];
pthread_mutex_destroy(&_lock);
}
如我们所料,在FBKVOController做了移除观察者的处理。
总结
通过阅读FBKVOController源码,我们主要可以了解一种设计模式,对我们的业务开发会设计会有一些启发。