前两天基本上学了RxSwift的一些基本概念, 信号构成和组合, Rx的基本思想. 此文来看一发给信号添加中间操作的一些API.
Map
Observable.of(1, 2, 3)
.map { $0 * $0 }
.subscribeNext { print($0) }
.addDisposableTo(disposeBag)
提交到subscriber手中之前, 对event的值做一些额外操作.
FlatMap & flatMapLatest
和之前的switchLatest()
一样, flatMap
, flatMapLatest
让观察者观察的东西变成动态的了. 后者是只观察最后一个值.
let 👦🏻 = Player(score: Variable(80))
let 👧🏼 = Player(score: Variable(90))
let player = Variable(👦🏻)
// Variable的构成: value.
player.asObservable()
.flatMap { $0.score.asObservable() } // Change flatMap to flatMapLatest and observe change in printed output
Scan
Observable.of(10, 100, 1000)
.scan(1) { aggregateValue, newValue in
aggregateValue + newValue
}
Scan
类似于Swift原生带的 reduce
方法, 逐层操作, aggregateValue
作为临时变量, 记录上一次返回的值, scan
带的参数为aggregateValue
的初始值. 和reduce的区别在于, 每一次的返回值都会作为Observable的value来sendNext.
Filter
filter
和原生Array.filter
的操作一样:
Observable.of(
"🐱", "🐰", "🐶",
"🐸", "🐱", "🐰",
"🐹", "🐸", "🐱")
.filter {
$0 == "🐱"
}
distinctUntilChanged
这个操作顾名思义,"前后信号传递的值一致则主动忽略重复".
Observable.of("🐱", "🐷", "🐱", "🐱", "🐱", "🐵", "🐱")
.distinctUntilChanged()
这个基本是之前提到的latest系列API的另一种实现手段吧.
elementAt
提取subscribe之后第n个信号:
Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
.elementAt(3)
太多了, 其他的API, 我就简单抄一下吧:
single()
只向下传第一个信号
single { $0 == "1" }
只向下传满足条件的第一个信号
take(3)
向下传前3个信号
takeLast(3)
向下传最后3个信号
takeWhile { $0 < 4 }
向下传从头开始数满足条件的信号, 一旦不满足, 后面的忽略.
skip(2)
忽略前2个
skipWhile { $0 < 4 }
忽略从头开始数满足条件的, 一旦条件不满足, 下面的都不忽略.
skipWhileWithIndex { element, index in index < 3}
index小于3的忽略
skipUntil(referenceSequence)
一直忽略, 知道referenceSequence发送信号.
Skip和Take系列方法主要就是在Filter的基础上加了"从头/从尾"开始算的条件, 感觉一般来说filter就足够了吧.
深度转换
.toArray()
转成Array输出
.reduce(1, accumulator: +)
合并且批处理
concat()
是让variable变化value的时候, 在前一个Observable发送compete之后, 才让后一个Observable变成可用的.
variable.asObservable()
.concat()
在Rx的这个网站上, 官方演示了所有控制信号的API的图形化演示:
http://rxmarbles.com/
Referece:
https://github.com/ReactiveX/RxSwift/tree/master/Rx.playground
https://github.com/ReactiveX/RxSwift/tree/master/Documentation
网友评论