FBKVOController源码分析

2,240 阅读2分钟

源码

FBKVOController

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]

  1. 弱引用持有self
  2. 初始化一个NSMapTable表,这个表主要存储了objectkvo infos对应的信息

添加观察者

下面以block的这种方式为例,其他的几种方式流程一样

  1. 先创建一个_FBKVOInfo实例,让后判断objectInfosMap之前是否存在,这个info实例,如果不存在则添加进去

添加到表中.png 2.单列注册系统的observer

[[_FBKVOSharedController sharedController] observe:object info:info] 其中做了一些状态的判断,如果状态为没有注册,就会移除。

回调处理

在系统的方法里面做如下处理:

截屏2021-07-29 下午5.40.41.png 如果是block方式,则block回调,如果是自定义actions,则调用自定义的action,如果实现了系统的回调方法,则调用系统的。

移除观察

vc 持有 FBKVOController 对象,vc控制释放的时候会调用vc的dealloc,也会调用,FBKVOController 对象的dealloc,如果在这个里面移除观察者,这不需要在每个控制器里面移除。

- (void)dealloc
{
  [self unobserveAll];
  pthread_mutex_destroy(&_lock);
}

如我们所料,在FBKVOController做了移除观察者的处理。

总结

通过阅读FBKVOController源码,我们主要可以了解一种设计模式,对我们的业务开发会设计会有一些启发。