ps: Observable 被观察对象; Observers 观察者;
前言
学习资源:RxSwift
步骤
从Github拉下
RxSwift
;- 1234Open Rx.xcworkspace.Build the RxSwift-macOS scheme (Product → Build).Open Rx playground in the Project navigator.Show the Debug Area (View → Debug Area → Show Debug Area).
创建序列
创建普通Observable序列
|
|
Range序列
|
|
RepeatElement序列
|
|
Generate序列
|
|
deferred
|
|
error序列
|
|
Never序列
|
|
Empty序列
|
|
Just序列
|
|
Of序列
|
|
from序列
|
|
Subject
Subject可以看作是代理或者桥梁。既是订阅者又是订阅源,也就是既可以订阅其他Observable对象,又可以向订阅者发送事件。
其中PublishSubject
,ReplaySubject
,BehaviorSubject
即将被清除时也不会自动发送完成(Completed)事件。
PublishSubject
publishSubject
遵循了ObserverType
协议。广播事件给所有的订阅者
|
|
ReplaySubject
广播事件给所有订阅者,并会补发发送事件给新的订阅者。通过bufferSize
可以指定给新的订阅者缓存几个已发送事件。
|
|
BehaviorSubject
广播所有事件给订阅者,发送最近的一次发送事件给新的订阅者,如果没有最近的发送事件则发送默认值。
|
|
Variable
基于BehaviorSubject
的封装,也是发送最近的发送事件或默认值给新的订阅者。但Variable
会保留当前值状态,并且永远都不会发送错误(Error)事件,然而,它会在析构(deinit)的时候自动发送Completed事件。
调用Variable
实例的asObservable
方法获取BehaviorSubject
序列。Variable
并没有实现on
操作符,所以通过暴露value
属性设置当前值于获取当前值。通过设置一个新的值就可以将这个值添加到BehaviorSubject
序列中。
|
|
Combination(合并操作)
通过操作符可以将多个观察源(序列)转化为一个观察源(序列)
startWith
在开始发送事件元素前发送指定序列的元素
|
|
merge
将多个源序列中的元素组合成一个新的Observable
序列。
|
|
zip
将多个序列中的元素根据一定的原则组合在一起,序列之间的元素一一对应后再合并。
|
|
combineLatest
将多个序列的元素按一定的原则组合在一起形成一个新的Observable
序列,当每一个源序列至少发送一个元素时,combine序列就开始发送第一个元素,并且接下来任意一个序列发送一个元素,combine序列都会使用每一个源序列中最新的元素组合发送新元素。ps:combineLates
还支持传入数组以及任意集合型的Observables
序列。
|
|
switchLatest
将事件序列的序列切换到最新的一条序列当中
|
|
Transform(转换操作)
map
对序列中的每个元素进行转换
|
|
flatMap && flatMapLatest
map
做转换时容易出现“升维”的情况,即转变之后从一个序列变成了一个序列的序列。Swift中过滤nil
的最佳方案就是flatMap
。
flatMapLatest则是只获取最新的一个元素
|
|
scan
累计每次的运算结果,作为下次运算的输入值
|
|
Filtering and Conditional(过滤与条件操作)
filter
只发送符合条件的元素
|
|
distinctUntilChanged
发送符合条件的元素,且会过滤连续重复的元素
|
|
elementAt
获取制定index位置的元素,越界则抛出error
错误。
|
|
single
获取符合条件的第一个元素,如果无条件则获取序列第一个元素,有多个元素或者无符合条件的元素时会抛出error
错误。
|
|
take
获取序列中的指定数量的前n个元素
|
|
takeLast
从序列的尾部获取指定数量的元素。确定范围后元素顺序取
|
|
takeWhile
从序列的头部顺序获取符合条件的元素,一旦不满足条件就停止匹配元素。
|
|
takeUntil
发送源(source)Observable
序列的元素,一旦关联(reference)Observable
序列发送元素发送Completed
消息,停止发送源Observable
序列的元素。
|
|
skip
直接过滤掉头部指定数量的n个元素
|
|
skipWhile
跳过满足条件的值直到条件为false
时开始获取序列的元素。
|
|
skipWhileWithIndex
基于skipWhile
的基础,不过条件中提供了index
参数,可将index
作为条件判断的一个方式。
|
|
skipUntil
跳过源序列的元素,直到关联序列开始发送元素。
|
|
Mathematical and Aggregate Operators(聚合操作)
toArray
将序列转换成一个数组,将这个数组当成一个新元素发送然后completed
。
|
|
reduce
设置初始值,与序列中的每一个值进行指定运算,返回最后结果当作一个值发送。
|
|
concat
串联多个序列,新的序列只有在前一个序列completed
后才会发送新序列中的值。
|
|
Connectable(连接操作)
Connectable序列其实很像一般的序列,但不会像一般序列一旦被订阅就会发送值,它只会在调用connect
后才会发送值。因此,你可以通过该序列在所有订阅者订阅之后再发送值。
|
|
publish
将一个普通序列转化为可连接(connectable)的序列,只有在调用connect()
之后才开始发送值。
|
|
replay
将普通序列转化为可连接序列,并会在调用connect()
之后才开始发送值,且新的订阅者出现时会补发指定个数的值。
|
|
multicast
将普通序列转化为可连接序列,并会在调用connect()
之后才开始发送值。序列发送值时指定的subject
也会发射值。
|
|
Error(错误操作)
catchErrorJustReturn
捕获到错误时,返回指定的值然后终止
|
|
catchError
捕获错误,切换到其他序列
|
|
retry
捕获到错误后可对序列进行重新订阅。retry
中可以传参设置最大重新订阅次数。
|
|
debug(调试操作)
debug
打印所有的订阅,值发送与清理事件
|
|
RxSwift.Resources.total
提供所有Rx资源分配了内存的数量,检测内存泄漏的时候很有用。
|
|
其它操作
doOn副作用
|
|
发送事件
|
|
订阅
被观察对象只有存在订阅者时才会执行订阅闭包中的事件。
|
|
易混淆
map VS flatMap
map
是对数组中的所有元素一一映射。flatMap
在多维数组时,则会对序列做降维操作,也就是原本是二位的序列,处理后会变成一维。
|
|
Swift中过滤nil
的最佳方案就是flatMap
。原理: flatMap
的源码实现中遍历元素时对元素进行了if let语句解包处理,只有解包成功的才会添加到结果集中,因而具备自动去nil
值的效果。
|
|
takeWhile VS filter
takeWhile
按顺序获取符合条件的元素,一旦条件不符合,后面的元素也不进行匹配。
filter
则会对序列中的所有元素进行条件判断获取符合条件的所有元素。
reduce VS scan
reduce
: 指定初始值与序列所有元素进行累积运算,只发送最后一次的运算结果。
scan
:累计每次的运算结果,作为下次运算的输入值,每次的运算结果都会发送。
reduce
在scan
的基础上只获取最后一个元素。
ReplaySubject VS Replay
ReplaySubject
: 既是订阅者又是订阅源,也就是既可以订阅其他Observable对象,又可以向订阅者发送事件。通过bufferSize
可以指定给新的订阅者缓存几个已发送事件。
replay
:将普通序列转化为可连接序列,并会在调用connect()
之后才开始发送值,且新的订阅者出现时会补发指定个数(通过bufferSize
)的值。