FBKVOController 的使用

2021-05-31  本文已影响0人  chaeyeonyanse

系统 KVO 实现的替代方案
优势
1、不用手动移除观察者了
2、 不允许多次 addObserver 同一个 keypath
3、方便使用

实现流程
NSObject 有分类,添加了KVOController属性
vc(observer) 持有一个 KVOController,
KVOController 持有一个 observer(weak),一个_objectInfosMap , 一个互斥锁,锁在 读写_objectInfosMap时使用,保证线程安全
_objectInfosMap 类比 NSDictionary
key 为被观察的对象,比如_tb,
value 为一个 Set ,里面包含 _FBKVOInfo 对象,每一个对象代表一个独一无二的 keypath,这里保证了不能对同一个 keypath 多次观察
info 作为 context,传入addObserver:forKeyPath:options: context:的方法里,
在观察方法回调里,根据这个 context,找到是哪个 info(从而知道是哪个 keypath)
从而找到 info 的 block,进行回调
vc dealloc 以后,KVOController也会 dealloc,里面有unobserveAll方法,移除所有的观察者

上一篇下一篇

猜你喜欢

热点阅读