注意:使用本例中的代码首先应该导入头文件,代码如下:
import RxSwift
Transforming Operators
这类操作可以转换通过一个Observable
序列发散的 Next 事件中的元素。
map
应用一个转换闭包于通过一个Observable
序列发散的元素�,并且返回一个新的转换过元素的Observable
序列。了解更多
example("map") {
let disposeBag = DisposeBag()
Observable.of(1, 2, 3)
.map { $0 * $0 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
Debug Area 输出:
--- map example ---
1
4
9
flatMap 和 flatMapLatest
将一个Observable
序列发散出的元素转换成多个Observable
序列,并且合并这些发散元素作为一个单独的Observable
序列。有时候这是非常有用的,比如,当你有一个Observable
序列本身能自己发散Observable
序列,而且你希望能够响应新的发散和Observable
序列。flatMap
和flatMapLatest
不同的是,flatMapLatest
只会发出最新的Observable
序列内部的元素。了解更多
example("flatMap and flatMapLatest") {
let disposeBag = DisposeBag()
struct Player {
var score: Variable<Int>
}
let 👦 = Player(score: Variable(80))
let 👧 = Player(score: Variable(90))
let player = Variable(👦)
player.asObservable()
.flatMap { $0.score.asObservable() } // 尝试把 flatMap 换成 flatMapLatest 并且观察输出。
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
👦.score.value = 85
player.value = 👧
👦.score.value = 95 // 当使用 flatMap 时将被打印,但是使用 flatMapLatest 时将不会被打印。
👧.score.value = 100
}
Debug Area 输出:
--- flatMap and flatMapLatest example ---
80
85
90
95
100
- 在这个例子中 ,使用 flatMap 可能产生意想不到的后果。在把
👧
赋值给player.value
之后,👧.score
将开始发散元素,但是在前面Observable
序列之内也将一直发散元素。通过把flatMap
改变成flatMapLatest
,只有最新的Observable
序列之内将发散元素,也就是说,设置👦.score.value = 95
是没有意义的。
flatMapLatest
实际上是map
和switchLatest
操作的组合。
scan
首先使用一个值进行初始化,然后把Observable
序列发散的每个元素应用于一个累加器闭包中,并返回每个中间结果作为一个含有单个元素的Observable
序列。�了解更多
example("scan") {
let disposeBag = DisposeBag()
Observable.of(10, 100, 1000)
.scan(1) { aggregateValue, newValue in
aggregateValue + newValue
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
Debug Area 输出:
--- scan example ---
11
111
1111
下一篇: 七、��过滤和条件操作-Filtering and Conditional Operators(Rx.playground翻译)