注意:使用本例中的代碼首先應(yīng)該導(dǎo)入頭文件晌端,代碼如下:
import RxSwift
Transforming Operators
這類操作可以轉(zhuǎn)換通過一個(gè)Observable
序列發(fā)散的 Next 事件中的元素。
map
應(yīng)用一個(gè)轉(zhuǎn)換閉包于通過一個(gè)Observable
序列發(fā)散的元素?恬砂,并且返回一個(gè)新的轉(zhuǎn)換過元素的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
將一個(gè)Observable
序列發(fā)散出的元素轉(zhuǎn)換成多個(gè)Observable
序列,并且合并這些發(fā)散元素作為一個(gè)單獨(dú)的Observable
序列泻骤。有時(shí)候這是非常有用的漆羔,比如,當(dāng)你有一個(gè)Observable
序列本身能自己發(fā)散Observable
序列狱掂,而且你希望能夠響應(yīng)新的發(fā)散和Observable
序列演痒。flatMap
和flatMapLatest
不同的是,flatMapLatest
只會(huì)發(fā)出最新的Observable
序列內(nèi)部的元素趋惨。了解更多
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 // 當(dāng)使用 flatMap 時(shí)將被打印,但是使用 flatMapLatest 時(shí)將不會(huì)被打印希柿。
??.score.value = 100
}
Debug Area 輸出:
--- flatMap and flatMapLatest example ---
80
85
90
95
100
- 在這個(gè)例子中 诊沪,使用 flatMap 可能產(chǎn)生意想不到的后果养筒。在把
??
賦值給player.value
之后曾撤,??.score
將開始發(fā)散元素,但是在前面Observable
序列之內(nèi)也將一直發(fā)散元素晕粪。通過把flatMap
改變成flatMapLatest
挤悉,只有最新的Observable
序列之內(nèi)將發(fā)散元素,也就是說,設(shè)置??.score.value = 95
是沒有意義的装悲。
flatMapLatest
實(shí)際上是map
和switchLatest
操作的組合昏鹃。
scan
首先使用一個(gè)值進(jìn)行初始化,然后把Observable
序列發(fā)散的每個(gè)元素應(yīng)用于一個(gè)累加器閉包中诀诊,并返回每個(gè)中間結(jié)果作為一個(gè)含有單個(gè)元素的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翻譯)