本章我们来看下ReactiveObjc的类设计。
信号相关
我们先来看下ReactiveObjc关于信号的类设计。
RACStream
RACStream是一个抽象类。提供了抽象方法,操作方法,debug能力。我们可以看到作者使用category聚合功能。
为啥有些方法必须子类重写? 有些不用?
- 抽象方法(必须由子类重写)
- Debug
- operation方法
RACSignal
RACSignal继承RACStream。实现了信号创建,订阅功能。信号和订阅是一一对应关系。
- 重写了RACStream的抽象方法。
- 继承了RACStream的Debug和Operation方法。
- 新增了信号的创建方法。
- 新增主动触发
- 新增信号订阅
- 新增Debug方法
- 新增Test方法
RACSignal的子类
RACChannelTerminal
重写了RACSubscriber的send方法转发给内部持有一个otherTerminal,主要就实现了A信号发送到B信号的订阅。这个类主要是为RACChannel服务的。
RACChannel是RAC里面通道的概念,主要是实现A信号发送消息给B信号,B信号发送数据给A信号。是一个双向绑定的概念。
RACDynamicSignal
默认创建信号内部都是转发给这个信号类。这个类主要是重写了订阅的方法。
RACEmptySignal
空信号,不会关联Signal,订阅就直接发送sendCompleted
RACErrorSignal
Error信号,不会关联Signa,订阅直接发送error
RACReturnSignal
renturn信号,包装NSObject->Signal,订阅直接发送NSObject被包装的值,同事发送sendCompleted
RACSubject
主题信号,通过重写订阅,发送。 支持一个主题重复订阅。
RACSequence
RACSequence继承RACStream
订阅相关
RAC订阅主要是通过RACSubscriber 和 RACSignal配合来实现的。
RACSignal接收订阅,内部创建RACSubscriber实例,被回调给RACSignal创建的block。
回收相关
RAC订阅的回收或者说订阅动作的取消,都是用过RACDisposable及其子类来完成的。
我们先来看下RACDisposable的类图。
RACDisposable
订阅回收的基类,本身类非常简单。主要是挂载block。保存disposed状态。
RACCompoundDisposable
组合订阅回收类。 主要处理同事取消多个动作。重写了Disposable方法。
RACKVOTrampoline
建立KVO连接,处理KVO类的Disposable,重写Disposable,移除KVO观察者。
RACScopedDisposable
重写dealloc,内部调用Disposable。
RACSerialDisposable
RACMulticastConnection 捕获多订阅,内部通过RACReplaySubject实现。