RxSwift中最重要的一類操作符耕肩,叫做Transform operators它們用來(lái)把一個(gè)Observable中的事件八孝,變成另外一種形式插掂』艺埃可以說(shuō),任何一個(gè)基于RxSwift開發(fā)的項(xiàng)目辅甥,都會(huì)使用這一類操作符酝润。作為這個(gè)話題的第一部分,我們來(lái)看一些直觀易懂的Transform operators璃弄。
七種轉(zhuǎn)換操作符
delay
delayWithSelector
delayWithSelector.png
map
通過(guò)使用一個(gè)閉包函數(shù)將原來(lái)的Observable序列轉(zhuǎn)換為一個(gè)新的Observable序列
let disposeBag = DisposeBag()
Observable.of(1,2,3)
.map({
return $0 * $0
}).subscribe({print($0)})
.disposed(by: disposeBag)
執(zhí)行結(jié)果
next(1)
next(4)
next(9)
completed
flatmap
現(xiàn)實(shí)中很多事件都是異步發(fā)生的要销,而并不是像Observable.of創(chuàng)建的看起來(lái)像集合這樣的。因此夏块,當(dāng)我們需要對(duì)異步發(fā)生的事件序列進(jìn)行變換的時(shí)候疏咐,就需要訂閱原來(lái)的事件序列,對(duì)異步發(fā)生的事件有所察覺(jué)脐供。其中浑塞,網(wǎng)絡(luò)編程就是一個(gè)最典型的例子。為了在請(qǐng)求一個(gè)網(wǎng)絡(luò)資源后政己,根據(jù)服務(wù)器返回的結(jié)果對(duì)原事件序列進(jìn)行變換酌壕,flatMap就是最好的選擇
let disposeBag = DisposeBag()
struct Student {
var score:Variable<Int>
}
let student1 = Student(score: Variable(60))
let student2 = Student(score: Variable(70))
let observables = Variable(student1)
observables.asObservable()
.flatMap({
$0.score.asObservable()
})
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
student1.score.value = 75
observables.value = student2
student1.score.value = 85
student2.score.value = 20
執(zhí)行結(jié)果
60
75
70
85
20
scan
scan就是提供一個(gè)初始化值,然后使用計(jì)算閉包不斷將前一個(gè)元素和后一個(gè)元素進(jìn)行處理歇由,并將處理結(jié)果作為單個(gè)元素的Observable序列返回
let disposeBag = DisposeBag()
Observable.of(10, 100, 1000)
.scan(2) { aggregateValue, newValue in
aggregateValue + newValue
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
執(zhí)行結(jié)果:
12
112
1112
toArray
let bag = DisposeBag()
Observable.of(1, 2, 3)
.toArray()
.subscribe(onNext: {
// Array<Int>
print(type(of: $0))
// [1, 2, 3]
print($0)
}).addDisposableTo(bag)