Swift RxSwift(二)

Swift RxSwift(二)

Introduction

主要介绍了 Rx 的基础: Observable 。 Observable 是观察者模式中被观察的对象,相当于一个事件序列 (GeneratorType) ,会向订阅者发送新产生的事件信息。事件信息分为三种:

  • .Next(value) 表示新的事件数据。
  • .Completed 表示事件序列的完结。
  • .Error 同样表示完结,但是代表异常导致的完结。

empty

empty 是一个空的序列,它只发送 .Completed 消息。

never

never 是没有任何元素、也不会发送任何事件的空序列。

just

just 是只包含一个元素的序列,它会先发送 .Next(value) ,然后发送 .Completed 。

sequenceOf

sequenceOf 可以把一系列元素转换成事件序列。

form

form 是通过 asObservable() 方法把 Swift 中的序列 (SequenceType) 转换成事件序列。

create

create 可以通过闭包创建序列,通过 .on(e: Event) 添加事件。

failWith

failWith 创建一个没有元素的序列,只会发送失败 (.Error) 事件。

deferred

deferred 会等到有订阅者的时候再通过工厂方法创建 Observable 对象,每个订阅者订阅的对象都是内容相同而完全独立的序列。

Subjects

接下来是关于 Subject 的内容。 Subject 可以看做是一种代理和桥梁。它既是订阅者又是订阅源,这意味着它既可以订阅其他 Observable 对象,同时又可以对它的订阅者们发送事件。
如果把 Observable 理解成不断输出事件的水管,那 Subject 就是套在上面的水龙头。它既怼着一根不断出水的水管,同时也向外面输送着新鲜水源。如果你直接用水杯接着水管的水,那可能导出来什么王水胶水完全把持不住;如果你在水龙头下面接着水,那你可以随心所欲的调成你想要的水速和水温。

PublishSubject

PublishSubject 会发送订阅者从订阅之后的事件序列。

ReplaySubject

ReplaySubject 在新的订阅对象订阅的时候会补发所有已经发送过的数据队列, bufferSize 是缓冲区的大小,决定了补发队列的最大值。如果 bufferSize 是1,那么新的订阅者出现的时候就会补发上一个事件,如果是2,则补两个,以此类推。

BehaviorSubject

BehaviorSubject 在新的订阅对象订阅的时候会发送最近发送的事件,如果没有则发送一个默认值。

Variable

Variable 是基于 BehaviorSubject 的一层封装,它的优势是:不会被显式终结。即:不会收到 .Completed 和 .Error 这类的终结事件,它会主动在析构的时候发送 .Complete 。

Transform

我们可以对序列做一些转换,类似于 Swift 中 CollectionType 的各种转换。在以前的坑中曾经提到过,可以参考:函数式的函数。

map

map 就是对每个元素都用函数做一次转换,挨个映射一遍。

flatMap

map 在做转换的时候很容易出现『升维』的情况,即:转变之后,从一个序列变成了一个序列的序列。

scan

scan 有点像 reduce ,它会把每次的运算结果累积起来,作为下一次运算的输入值。

Filtering

除了上面的各种转换,我们还可以对序列进行过滤。

filter

filter 只会让符合条件的元素通过。

distinctUntilChanged

distinctUntilChanged 会废弃掉重复的事件。

take

take 只获取序列中的前 n 个事件,在满足数量之后会自动 .Completed 。

Combining

这部分是关于序列的运算,可以将多个序列源进行组合拼装成一个新的事件序列。

startWith

startWith 会在队列开始之前插入一个事件元素。

combineLatest

如果存在两条事件队列,需要同时监听,那么每当有新的事件发生的时候,combineLatest 会将每个队列的最新的一个元素进行合并。

zip

zip 人如其名,就是压缩两条队列用的,不过它会等到两个队列的元素一一对应地凑齐了之后再合并。

marge

merge 就是 merge 啦,把两个队列按照顺序组合在一起。

switch

当你的事件序列是一个事件序列的序列 (Observable>) 的时候,(可以理解成二维序列?),可以使用 switch 将序列的序列平铺成一维,并且在出现新的序列的时候,自动切换到最新的那个序列上。和 merge 相似的是,它也是起到了将多个序列『拍平』成一条序列的作用。

Error Handling

在事件序列中,遇到异常也是很正常的事情,有以下几种处理异常的手段。

catchError

catchError 可以捕获异常事件,并且在后面无缝接上另一段事件序列,丝毫没有异常的痕迹。

retry

retry 顾名思义,就是在出现异常的时候会再去从头订阅事件序列,妄图通过『从头再来』解决异常。

Utility

这里列举了针对事件序列的一些方法。

subscribe

subscribe 在前面已经接触过了,有新的事件就会触发。

subscribeCompleted

subscribeCompleted 是只订阅 .Completed 完成事件。

subscribeError

subscribeError 只订阅 .Error 失败事件。

doOn

doOn 可以监听事件,并且在事件发生之前调用。

Conditional

我们可以对多个事件序列做一些复杂的逻辑判断。

takeUntil

takeUntil 其实就是 take ,它会在终于等到那个事件之后触发 .Completed 事件。

takeWhile

takeWhile 则是可以通过状态语句判断是否继续 take 。

Aggregate

我们可以对事件序列做一些集合运算。

concat

concat 可以把多个事件序列合并起来。

reduce

这里的 reduce 和 CollectionType 中的 reduce 是一个意思,都是指通过对一系列数据的运算最后生成一个结果。

Next