源码
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
源码,我们主要可以了解一种设计模式,对我们的业务开发会设计会有一些启发。