ReactiveCocoa 层次构成(笔记)

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方法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容