响应式编程框架ReactiveCocoa学习——框架概览

来源:互联网 发布:js语言精粹笔记 编辑:程序博客网 时间:2024/05/17 23:20

       这篇博客将会继续翻译RAC的官方文档Framework Overview. 主要是对RAC这和框架进行概览的介绍和学习。同时也可以参考我前面的两篇翻译《响应式编程框架ReactiveCocoa学习——基本操作符》《响应式编程框架ReactiveCocoa介绍与入门》。其中ReactiveCocoa的Github官方地址为 https://github.com/ReactiveCocoa/ReactiveCocoa 。

      这篇文档包括了RAC中的对不同组件的高层描述,并解释如何进行结合工作并按自己的功能模块进行分离。这篇文档可以成为学习新的模块或者特定文档的开始。

【Stream 流】

       流,在RAC中代表的是RACStream抽象类,是任何对象值的序列。我们可以立即获取值或者在之后某个时间获取,但是它们一定是被顺序检索的。在RAC中不可能出现当检索到流中的第二值的时候正在计算或者等待第一个值。流可以认为是原子的,所以在处理一些事情中,可以使用基本的操作符来进行复杂的操作(比如 -bind)。RACStream本身并没有太大的作用,大多数的流我们用的都是signals信号和sequence序列来代替。


【Signals 信号】

      一个信号,在RAC中代表的是RACSignal类,是一种push-driven主动推送的流。信号一般代表的是某种未来会传递的数据。一个任务的执行、数据的接收,信号中值的发送,会主动发送到每一个Subscriber订阅者。我们必须要订阅这些信号才能访问到这些信号中的值。信号给他们的订阅者发送三种不同的事件类型:

1.next事件:next从流中提供一个新的值。RACStream方法只能操作这种类型的事件。与原生Cocoa框架不同,这对于包括nil的信号是完全合法的。

2.error事件:该事件表示早一个信号正常结束之前发生了一个错误。error事件中可以包括NSError对象,可以检测错误原因。错误必须需要特定处理,它们没有包括在流的值中。

3.completed事件:表示信号正常结束,同时也没有其他更多的值添加到流中。Completed也需要被特定处理,它们也没有被包含在流的值中。

信号的生命周期包含了任意数量的next事件,并在一个error或者completed事件后结束。


【Subscription 订阅】

       一个订阅者是在等待signal事件的发生。在RAC中,订阅者是表示一类符合RACSubscriber协议的对象。一次订阅是通过调用-subscribeNext:error:completed产生的。从技术实现上来说,大多数RACStream和RACSignal操作符都能创建一个订阅。订阅会持有它的signal对象,并且在信号completed或者error的时候释放。当然,订阅也可以被手动的释放。


【Subjects】

     一个Subject,在RAC中代表的是RACSubject类,是一种可以被手动控制的信号。Subject可以认为是可变的信号,就像NSMutableArray对于NSArray一样。Subject是很有用的连接非RAC代码到RAC的很有用的工具。举个例子,我们在block回调中处理大量的程序逻辑,其实我们可以使用发送事件到Subject去实现。然后Subject可以返回一个RACSignal对象,隐藏了回调中的实现细节。一些Subject也提供了额外的功能,比如RACReplaySubject可以为将来的订阅者缓存事件,比如网络请求先完成,然后其他对象再去处理结果。


【Commands】

      command,在RAC中表示的是RACCommand类,可以创建或者订阅一个信号用来响应某些action动作。这可以很方便的来处理App中的用户交互。一般是UI动作来触发一个command,比如按钮点击。基于信号的Commands可以自动置为无效,并且代表了UI的无效状态。在OS X中,可以给NSButton添加一个rac_command属性,来自动设置这种行为。


【Connections】

        connection,在RAC中代表的是RACMulticastConnection类,是一种可以被多个订阅者公用的subscription.信号默认是冷信号,也就是说每当新增一个订阅的时候,信号都会重新执行他们的任务。可能有时候这种行为是需要的,因为对于每个订阅者都需要重新计算数据,但是如果这种副作用本身产生很高的成本(比如网络请求),那么就会产生一定的问题。

       一个connection通过-publish或者-multicast来创建,方法实现是在RACSignal中。一旦连接,这个connection的信号就是热信号,并且连接的connection都是激活状态直到被释放。


【Sequences】

        sequence,在RAC中代表的是RACSequence类,是一种pull-driven的流。Sequence是一种集合类型,类似NSArray.但是又与数组不同的是,sequence的值默认是懒计算的(只有它们在被需要的时候才会计算)。这可以默认提升性能。和原生Cocoa中的集合类型一样,sequence也不能包含nil.  对于Cocoa中的集合类,RAC增加了-rac_sequence这个扩展方法,然后就可以让集合可以使用RACSequence来替代。


【Disposables】

        RACDisposable类用来做资源的取消和清理工作。Disposables常常用来取消对一个信号的订阅。当一个订阅取消后,相对应的订阅者就不再会收到信号发出的任何事件。除此之外,和该订阅相关的所有任何(比如后台进程,网络请求)都会被取消,因为他们的结果已经不需要了。


【Schedulers】

       scheduler,代表的是RACScheduler类,是一个串行的信号执行队列,用来执行任务或者传递结果。Schedulers类似于GCD中的队列,但是scheduler支持取消队列(通过disposables),并总是串行执行的。+immediateScheduler方法的异常就是不提供同步执行,这也有效的避免了死锁,同时鼓励使用信号运算符来替代block。RACScheduler也类似于NSOperationQueue,但是scheduler不允许任务重新排序或者相互依赖。


【Value types】

      RAC提供了多种类来方便的表示流中的值:

1.RACTuple:是一个常量大小的集合类型,可以包含nil(使用RACTupleNil表示)。这个常常用来表示多种流组合后的值。

2.RACUnit:是一个单例的空值。

3.RACEvent:用一个单一的值来表示信号事件,主要使用的方法是RACSignal中的-materialize。


本文主要翻译自 ReactiveCocoa官方文档Framework Overview。


2 0