美文网首页
ReactiveCocoa 层次构成(笔记)

ReactiveCocoa 层次构成(笔记)

作者: iOS_tao | 来源:发表于2017-03-27 15:10 被阅读27次

    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方法
    

    相关文章

      网友评论

          本文标题:ReactiveCocoa 层次构成(笔记)

          本文链接:https://www.haomeiwen.com/subject/norrottx.html