Rx中的那些操作符
[TOC]
记录学习 Rx 过程中的各种操作符以ß及用法还有 tips 等等.
所有弹珠图均来自 RxMarbles App.
Filtering Opertators
-
ignoreElements: 忽略. next 事件.会接受到结束事件(.completed, .error).
ignoreElements.png -
filter: filter 接受一个作用于每个事件的predicate closure,当 predicate 结果为 true时通过.
filter.png
Skipping Opertators
-
skip: skip 操作符允许忽略从第一个到输入的number个事件.
skip.png -
skipWhile 与 skipUntil:
这两个都是带条件的 skip 操作符,skipWhile 接受一个断言来判断 Skip 哪一个;
skipWhile.png
而 skipUntil不是接受一个静态条件,而且是接受另一个 observable, 它会 skip source Observable 的事件直到收到 trigger Observable 的事件.
skipUntil.png
Taking Opertators
taking 是 skip 的对立面,这样就很好理解了. 直接放弹珠图.
take.png takeWhile.png takeUntil.pngTransforming Opertators
-
map: 跟 Swift的map 类似,接受一个闭包然后对每个事件做处理.
map.png -
flatMap: 最开始理解 Swift 的 map和 flatMap 就比较费劲,后来知道 flatMap 的核心就就是:
降维
先看看 flatMap的定义
public func flatMap<O: ObservableConvertibleType>(selector: (E) throws -> O) -> Observable<O.E> {
return FlatMap(source: asObservable(), selector: selector)
}
在 Rx 中,flatMap可以把一个序列转换成一组序列,然后再把这一组序列拍扁
成一个序列。拍扁
其实就是降维
的意思.
Combining Opertators
- CombineLatest: combineLatest 操作符用闭包接受每个队列最新的值,然后最新的值合并成一个新值发送出去.
- Concat: concat 操作符可以把多个队列合并起来,合并是顺序是按照队列添加的顺序
- Merge: merge操作符也是把对个队列合并,但与 concat 不同的是它是按照队列发出事件的时间来合并.
- StartWith: startWith 操作符给一个队列给定了一个初始值,这个值的类型必须和队列里面的元素类型相同.
share 与 shareReplay
如果有多个 observable需要共享同一个事件,就需要用到 share.
有一个情形,如果一个请求需要多次订阅,但又不想多次请求,那么就需要多个订阅者共享一个订阅者对象.
share: 如果订阅者降到0,会重置队列重新开始发送
shareReplay(_): 这里要传一个 bufferSize, 在share的基础上,队列会从最新的值开始重播bufferSize个值。
详细链接