ReactiveX 核心概念入门

ReactiveX 是什么

ReactiveX 是什么? ReactiveX.io(http://reactivex.io/intro.html) 强烈建议认真读一下 Rx 的官方介绍 根据官方解释 ReactiveX is a library for composing asynchronous and event-based programs by using observable sequences.... 它是一个通过可观察序列的形式提供异步和基于事件编程的程序库; 它扩展了观察者模式,支持处理 sequences 一系列数据和事件,添加了operators 运算符让你能够将一系列的数据或事件清晰的组合到一起,而不用过分关注底层的线程,同步,线程安全,并发数据结构和非阻塞 IO等技术。

核心概念

首页上的一句话最简明扼要 An API for asynchronous programmingwith observable streams 使用可观察流进行异步编程API。 这里面提到两个关键概念:可观察的。为方便起见后面简称 ReactiveX 为 Rx,基于 Rx 的编程就是围绕着观察者和被观察者,以流的思想进行程序开发。 人们常常称 Rx 为 FRP, 函数式响应编程,Rx 可能是函数式的,也可能是响应式的,但是它们是不同的两个事物。两者的主要的区别是 FRP 关注的是值随着时间的持续变化,而 Rx 关注的是离散的值。(参考 Conal Elliott’s work for more-precise information on functional reactive programming(https://github.com/conal/essence-and-origins-of-frp))

Observable 和 Observer

这两个概念是密不可分的,是成对出现的,就像作用力和反作用力的关系。 观察者在订阅了可观察的对象之后,才能从中得到需要的信息。

流和函数式编程思想

简单说一下,很多地方都提到过流,这个概念很形象,流的特点是可以进行串联,并联,并且是动态顺序的。 函数式编程中的函数并不是编程中通常意义的函数,而是数学中的函数。一句话,原则就是输入不变的情况下,输出恒定不变,并且参数也不可改变。

Stream (流)

Stream 是基于事件推送的可观察组件,Stream 本身不会被直接拿来使用,它会以信号或主题的形式被实际使用。 事件推送,其实就是当事件发生的时候,由事件源主动将事件传递给接收方。直观点说,就是通过观察者模式调用注册过的观察者回调方法,将数据传递过去。

Subscription (订阅)

订阅是获取信号传递事件的唯一途径,当你对某事件感兴趣的时候,你可以订阅该信号来获取它传递的数据。Subscriber 订阅者代表着等待接受事件的对象。 在 Rx 中 Subscriber 代表着观察者,同时 Rx 中有三个事件:next, completed, error,分别对应着三个推送方法:sendNext, sendCompleted, sendError

Signal (信号)

Signal 信号,是 Stream 的一个变体,它在Stream的基础上提供了 onNext,onCompleted,onError三个事件,当信号完成自己的任务后,必须发送 onCompleted,onError两个事件来结束生命周期。 可以理解信号是传递事件的通道,就像一根带有插线板的电线,电流就是传递的数据。

Subject (主题)

主题,是一种能手动控制的信号。你可以把业务逻辑,在主题中进行实现,最后外部感兴趣的对象会对主题进行订阅,来接受业务逻辑传递的事件数据。

Sequence

序列,也是流的一种变体。是一个基于事件拉取的组件,功能上将集合类型的数据按照顺序通过订阅的方式传递给订阅者。

Disposable

Disposable 是用来对信号进行收尾处理的组建,比如:释放资源,取消等行为。可以理解为是 Stream 的一种 dealloc 机制。

ReactiveX 的运算符们 (Operators)

篇幅有限,只介绍几个常用的Rx流运算符。

mapping

映射,将某信号携带的数据经过处理后再发送出去。 一次只能处理一个信号。

flattern

扁平化,在信号的消息传递顺序上和串联一样,不同的地方是,扁平化操作,只会将被串联的最后一个信号传递给订阅者。

串联是将每一个信号的消息都传递给订阅者。

switch

concat

“串联”运算符,比较好理解,通过将多个信号串联在一起,并严格按照被串联的信号先后顺序,依次将消息发送给订阅者。 举个例子: 被串联的信号顺序依次是 A, B, C, D , 不论发送消息的顺序如何,最后接受消息的顺序都是 A, B, C, D。用小写字母代表对应发送的消息,a, b, c, d。 如果发送顺序是 a, c, d, b。 那么订阅者在接受到 a 消息后,会一直等到 b 消息才会去接收 c 消息,即使消息源已经发送了 c 消息也不会接受到它。

combining

联合运算符,将多个信号联合生成一个新的信号,并且都接收到数据后才会发送消息。 传递的数据结构是,通过 RACTuple 的形式将多个信号的数据结果联合到一起

filter

将信号 A 中传递的数据,通过“过滤”运算符计算后生成一个新的被过滤后的信号,该信号的消息传递过程中会通过 filter 中的逻辑来决定是否需要传递给订阅者,因此最终的结果是只输出了符合要求的内容。

reduce

一般和 combine 联合使用,对被 combine 汇总的数据一次性处理之后,将结果通过单独一个信号,发送给订阅者。

sequence

通过“顺序”运算将集合类型的数据,按顺序发送给订阅者,所以在这里也可以理解为是另一种形式的迭代运算。

merge

merge 将多个信号中的一个发送给订阅者,订阅者的接收顺序因消息发送顺序而定。

总结:

Rx 的目标:对观察者的扩展,解决异步,并发编程的代码可读性,让开发者更好的关注业务。 Rx 编程思想的核心概念:流式编程,观察者,订阅者,订阅,流运算符。