ReactiveCocoa2 源码浅析

547 查看

• 开车不需要知道离合器是怎么工作的,但如果知道离合器原理,那么车子可以开得更平稳。

ReactiveCocoa 是一个重型的 FRP 框架,内容十分丰富,它使用了大量内建的 block,这使得其有强大的功能的同时,内部源码也比较复杂。本文研究的版本是2.4.4,小版本间的差别不是太大,无需担心此问题。 这里只探究其核心 RACSignal 源码及其相关部分。本文不会详细解释里面的代码,重点在于讨论那些核心代码是 怎么来 的。文本难免有不正确的地方,请不吝指教,非常感谢。

@protocol RACSubscriber

信号是一个异步数据流,即一个将要发生的以时间为序的事件序列,它能发射出三种不同的东西:valueerrorcompleted。咱们能异步地捕获这些事件:监听信号,针对其发出的三种东西进行操作。“监听”信息的行为叫做 订阅(subscriber)。我们定义的操作就是观察者,这个被“监听”的信号就是被观察的主体(subject) 。其实,这正是“观察者”设计模式!

RAC 针对这个订阅行为定义了一个协议:RACSubscriber。RACSubscriber 协议是与 RACSignal 打交道的唯一方式。咱们先不探究 RACSignal 的内容,而是先研究下 RACSubscriber 是怎么回事。

先来看下 RACSubscriber 的定义:

##1、NLSubscriber
咱们自己来实现这个协议看看(本文自定义的类都以 “NL” 开头,以视区别):

现在咱们这个类只关心 sendNext:sendError:sendCompleted。本类的实现只是简单的打印一些数据。那怎么来使用这个订阅者呢?RACSignal 类提供了接口来让实现了 RACSubscriber 协议的订阅者订阅信号:

用定时器信号来试试看:

下面是输出结果: