ReactiveCocoa 层次构成(笔记)

2017-03-27  本文已影响27人  iOS_tao

ReactiveCocoa 是一个iOS中的函数响应式编程框架,将原有的各种设计模式,如代理、Block回调、Target/Action、通知以及KVO等各种输入,都抽象成信号(状态流),
并且可以对不同的信号进行任意的组合和链式操作(比如映射,组合,过滤等),从最原始的输入直到得到最终的输出。

从层次上看,ReactiveCocoa主要四大核心组件构成:
1.信号源:RACStream及其子类(最核心部分)
2.订阅者:RACSubscriber的实现类及其子类
3.调度起:RACScheduler及其子类
4.清洁工:RACDisposeable及其子类


信号源:

信号源代表的是随着时间而改变的值流,订阅者可以通过订阅信号源来获取这些值。
RACStream是ReactiveCocoa中最核心的类,代表的是任意的值流,它的主要继承结构图如下:
  RACStream是一个抽象类,一般并不会去实例化它,而是直接使用它的两个子类RACSignal和RACSequence。
  RACSignal代表的是未来将会被传送的值,它是一种push-driver(推驱动)的流。

它可以向订阅者发送三种不同类型的事件:
next(向订阅者传送新的值,可为nil);
error(向订阅者表明信号在正常结束前发生了错误);
completed(向订阅者表明信号已经正常结束)

通常情况下,一个信号的生命周期是由任意个next事件 和一个error事件或一个complete事件组成的。

RACSignal 为一个类簇,下面有5个子类
1.RACEmptySignal:空信号,用来实现RACSignal的+empty方法。
2.RACReturnSignal:一元信号,用来实现RACSignal的+return方法。
3.RACDynamicSignal:动态信号,使用一个block来实现订阅行为,RACSignal 的+CreateSignal方法就是该类的实例
4.RACErrorSignal:错误信号,用来实现RACSignal的+error方法。
5.RACChannelTerminal:通道终端,代表RACChannel的一个终端,用来实现双向绑定。
6.RACSubject:可以手动控制的信号,我们可以把它看作RACSignal的可变版本。

对于RACSignal类簇来说,最核心的方法为-subscribe:了,它是订阅者与信号源产生联系的唯一入口,它是一个抽象方法,由5个子类重写实现,是区分不同子类的关键。

RACSequence 代表的是一个不可变的值的序列,与RACSignal不同,它是pull-driven(拉驱动)类型的流,但它并不算信号源,因为不能被订阅者订阅,但是它与RACSignal之间可以非常方便的进行转换。
  RACSequence有两部分组成,head和tail(一个序列的tail仍然是一个序列),RACSequence可简化Objective-C的集合操作。

RACSequence的一系列功能也是通过类簇来实现的,它共有9个不同功能的私有子类:
1.RACUnarySequence:一元序列,用来实现RACSequence的+return方法
2.RACIndexSetSequence:用来遍历索引集;
3.RACEmptySequence:空序列, 用来实现RACSequence的+empty方法。
4.RACDynamicSequence:动态序列,使用blocks来动态地实现一个序列。
5.RACSignalSequence:用来遍历信号中的值。
6.RACArraySequence:用来遍历数组中的元素。
7.RACEagerSequence:非懒计算的序列,在初始化时立即计算所有的值。
8.RACStringSequence:用来遍历字符串中的字符。
9.RACTupleSequence:用来遍历元组中的元素。

订阅者:

实现了RACSubscriber协议的类都可以作为信号源的订阅者。
在RACSubscriber协议中,声明了4个必须实现的方法。其中,-sendNext:、-sendError:和 -sendCompleted分别用来从RACSignal接受next、error和completed事件,而-didSubscriberWithDisposable:则接收代表某次订阅的disposable对象。
  订阅者对信号源的一次订阅过程:通过RACSignal的-subscriber:方法传入一个订阅者,并最终返回一个RACDisposable对象。RACDisposable可以取消订阅。

除了RACSignal的子类外,还有两个实现了RACSubscriber协议的类
1.RACSubscriber
2.RACPassthroughSubscriber

调度器

调度订阅者订阅信号源过程中所涉及到的任务。
RACScheduler:扮演者调度器的角色,它是用GCD的串行队列来实现的,并支持取消操作。在RAC中,并没有使用到NSOperationQueue和NSRunloop技术。

RACScheduler 也是通过类簇实现
1.RACImmediateScheduler:立即执行调度的任务
2.RACQueueScheduler:一个抽象的队列调度器,在一个GCD串行队列中已不调度所有任务
3.RACTargetQueueScheduler:继承自RACQueueScheduler,在一个以任意的GCD队列为target的串行队列中异步调度所有任务。
4.RACSubscriptionScheduler:一个只用来调度订阅的调度器

清洁工

在订阅者订阅信号源的过程中,可能会产生副作用和消耗一定的资源,所以在取消订阅或完成订阅时,需要做资源回收和垃圾清理。RACDisposable封装了取消和清理一次订阅所必须的工作,核心方法-dispose。

它有四个子类:
1.RACSerialDisposable:作为disposable的容易使用,可以包含一个disposable对象
2.RACKVOTrampoline:代表一次KVO观察,并且可以用来停止观察
3.RACCompoundDisposable:也作为disposable的容器使用,可以包含多个disposable对象,并且可以手动添加和移除对象,当其对象被disposed时,它所包含的所有disposable对象都会被disposed
4.RACScopeDisposable:当它被dealloc的时候调用本身的-dispose方法
上一篇下一篇

猜你喜欢

热点阅读