前言
学习RxSwift之前,需要了解一下ReactiveX,由于ReactiveX保护了绝大多数言语的呼应式结构。这些言语采用统一的风格和思想,所以要想深入了解呼应式结构的原理,您最好先了解一下ReactiveX,有爱好的同学也能够去官网读一下官方的介绍。
ReactiveX
ReactiveX是一个库,经过可调查序列的办法 编写异步和根据事情的应用程序。
它对调查者形式进行了扩展,然后支撑数据和事情的序列化。而且增加了操作符,答应您以声明的办法将序列组合在一起。一起让你不必再关注初级线程、同步、线程安全、并发数据结构和非堵塞I/O等问题.
访问多个项目的异步序列是不太简单的,ReactiveX作为一种理想的办法处理了这个问题,然后填补了这个空白
它有时被称为函数呼应式编程,但这是不精确的。由于ReactiveX既能够是函数式的也能够是呼应式的。一个主要的区别是,函数反应式编程对随时刻接连改动的值进行操作,而ReactiveX对随时刻宣布的涣散的值进行操作。(有关函数反应式编程的更精确信息,请参阅这里。)
为什么运用Observables?
由于ReactiveX可调查模型答应你处理异步事情流,就像运用数组搜集数据相同简单。它将您从扑朔迷离的回调网络中解放出来,然后使您的代码更具可读性,更不简单出现错误。
Observables是能够进行组合的
像 Java Futures这样的技术,能够直接处理单一级其他异步使命。可是当使命嵌套时,就会变得越来越复杂,极易形成嵌套地狱,不易于保护。
关于异步履行使命,运用Futures是很难进行优化的(或许不或许,由于每个恳求的延迟在运行时会有所不同)。当然,这也是能够做到的,但它很快就会变得复杂(因而很简单犯错),或许过早地堵塞Future.get(),然后消除了异步履行的优点。
另一方面,ReactiveX Observables也比较倾向于,对异步数据流和序列进行组合。
Observables是比较灵敏的
ReactiveX调查器,不仅支撑单个值的发射(就像Futures相同),还支撑值一连串值乃至无限流的发射。Observable是一个单一的笼统,能够用于这些用例中的任何一个。Observable具有Iterable一切的灵敏和高雅。
Observable是异步/推送,而Iterable是同步/拉取
Observables很少刚愎自用
ReactiveX并不会倾向于某些特定的并发性或异步性来历。Observable能够运用线程池、事情循环、非堵塞I/O、actor(例如来自Akka)或任何适合您的需求、风格来完结。客户端代码将其与Observables的一切交互视为异步的,不管您的底层完结是堵塞的还对错堵塞的,以及您挑选怎么完结它。
这个Observable是怎么完结的?
public Observable getData();
- 它和调用者在同一个线程上同步作业吗?
- 它在不同的线程上异步作业吗?
- 它是否将作业分配给多个线程,这些线程能够按任何顺序向调用方回来数据?
- 它运用一个Actor(或多个Actor)而不是线程池吗?
- 它是否运用带有事情循环的NIO来进行异步网络访问?
- 它是否运用事情循环将作业线程与回调线程别离?
从调查者的角度来看,这并不重要
更重要的是:运用ReactiveX,您今后能够改动主见,从根本上改动Observable完结的根本性质,而不会损坏Observable的顾客。
回调有自己的问题
回调经过不答应任何东西被堵塞来处理Future.get()过早堵塞的问题。它们天然生成高效,由于它们在呼应准备就绪时履行。
可是,与Futures相同,虽然回调很简单与单一级其他异步履行一起运用,但关于嵌套的组合,它们变得很难处理。
ReactiveX是一个多种言语的完结
ReactiveX目前以各种言语完结,以尊重这些言语的习惯用法的办法完结,而且正在快速增加更多的言语。
呼应式编程
ReactiveX供给了一组运算符,您能够运用这些运算符挑选、挑选、转化、整合和组合Observables。这答应高效的履行和组合。
您能够以为Observable类是经过推送的,相似于Iterable,只不过Iterable是经过拉取的。迭代器是顾客从生产者和线程块中拉取值,直到这些值抵达。相比之下,关于Observable,只需有可用的值,生产者就会将值推送给顾客。这种办法更灵敏,由于值能够同步或异步抵达
示例代码显示了怎么将相似的高阶函数应用于Iterable和Observable
Iterable
getDataFromLocalMemory()
.skip(10)
.take(5)
.map({ s -> return s + " transformed" })
.forEach({ println "next => " + it })
Observable
getDataFromNetwork()
.skip(10)
.take(5)
.map({ s -> return s + " transformed" })
.subscribe({ println "onNext => " + it })
Observable类型为Four’s Observer pattern形式的Gang增加了两个缺失的语义,以匹配Iterable类型中可用的语义:
- 当没有更多可用数据时,生产者向顾客宣布完结的信号(在这种情况下,Iterable上的foreach循环完结并正常回来;Observable调用其调查者的onCompleted办法)。
- 当产生错误时,生产者向顾客发犯错误产生的信号(假如迭代过程中产生错误,则Iterable抛出反常;Observable调用其调查者的onError办法)。
经过这些增加,ReactiveX协调了Iterable和Observable类型。它们之间仅有的区别是数据流动的方向。这一点非常重要,由于现在能够在Iterable上履行的任何操作,也能够在Observable上履行
总结
本文主要介绍了什么是ReactiveX,其中有许多地方说到了Observables,至于Observables详细是什么,会在下一篇文章中单独介绍。
或许有的同学在看完了,本篇文章之后会觉得懵逼。不要紧,别着急,由于笔者现在也有同感。笔者会在后面尽量把一些不太好了解的地方搞清楚分享给我们