1、map
(1)Definition
英文原意:
Applies a transforming closure to elements emitted by an Observable sequence,
and returns a new Observable sequence of the transformed elements.
1> 有一個 Observable sequence 發(fā)出 elements
2> map 函數(shù)提供一個 '轉換閉包',對上述 elements 進行轉換
3> 返回一個新的 Observable sequence怒炸,由轉換后的 elements 組成
(2)Diagrams
map.png
1> 初始的 elements 是: 1翘魄、2最筒、3
2> map 函數(shù)提供轉換閉包: x => 10 * x
3> 轉換后的 elements 是: 10水慨、20、30
(3)Code
// MARK: - map
func demoForMap() {
let disposeBag = DisposeBag()
let observable = Observable.of(1, 2, 3)
observable
.map({ $0 * $0 })
.subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag)
}
(4)Result
map 執(zhí)行結果.png
2叨襟、flatMap
(1)Definition
(2)Diagrams
flatMap.png
1> source observable 是 Observable<Int> 類型
2> flatMap 獲取到 source obserable 的第一個 element繁扎,取出 value,對其做 '乘10' 操作
3> 將轉換后的 element糊闽,重新投影到一個 observable 中(即 flatMap下面的第一條線)
4> target observable 將 element 發(fā)送給 subcriber(訂閱者)
5> 之后梳玫,第一個 element 的值變?yōu)?,轉換后變成40墓怀,再由 target observable 發(fā)送給 subcriber
6> 第二個汽纠、第三個 element 與之類似,不再詳述傀履。
(3)Code
// MARK: - flatMap
func demoForFlatMap() {
struct Student {
var score: Variable<Int>
}
let disposeBag = DisposeBag()
// 1 創(chuàng)建兩個 Student 的實例: jack 和 rose
let jack = Student(score: Variable(80))
let rose = Student(score: Variable(90))
// 2 創(chuàng)建一個 Student 類型的 Variable虱朵,初始值為 jack
let student = Variable(jack)
// 3 通過 flatMap 訪問到 score
student.asObservable()
.flatMap {
$0.score.asObservable()
}
// 4 打印 onNext 事件的 element
.subscribe(onNext: {
print($0)
})
.addDisposableTo(disposeBag)
jack.score.value = 85
student.value = rose
jack.score.value = 95
rose.score.value = 100
}
(4)Result
flatMap 執(zhí)行結果.png
3、flatMapLatest
(1)Definition
(2)Diagram
flatMapLatest.png
1> 01 被 flatMapLatest 接收钓账,將其值轉換為10碴犬,并將其投影到01的新 observable 中
2> 02 被 flatMapLatest 接收時,20對應的 observable 成為 latest observable梆暮,這個時候服协,即使 01 變成了 30,也不會被發(fā)送給 subcriber啦粹,因為此時它不在 latest observable 中
3> 03 的情況偿荷,以此類推
(3)Code
// MARK: - flatMapLatest
func demoForFlatMapLatest() {
struct Student {
var score: Variable<Int>
}
let disposeBag = DisposeBag()
// 1 創(chuàng)建兩個 Student 的實例: jack 和 rose
let jack = Student(score: Variable(80))
let rose = Student(score: Variable(90))
// 2 創(chuàng)建一個 Student 類型的 Variable窘游,初始值為 jack
let student = Variable(jack)
// 3 通過 flatMapLatest 訪問到 score
student.asObservable()
.flatMapLatest {
$0.score.asObservable()
}
// 4 打印 onNext 事件的 element
.subscribe(onNext: {
print($0)
})
.addDisposableTo(disposeBag)
jack.score.value = 85
student.value = rose
jack.score.value = 95
rose.score.value = 100
}
(4)Result
flatMapLatest 執(zhí)行結果.png
4、scan
(1)Definition
(2)Diagram
scan.png
(3)Code
// MARK: - scan
func demoForScan() {
let disposeBag = DisposeBag()
let observable = Observable.of(10, 100, 1000)
observable
.scan(2, accumulator: { aggregateValue, newValue in
aggregateValue + newValue
})
.subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag)
}
(4)Result
scan 執(zhí)行結果.png