RxSwift - 理論篇04 - Transform Operators

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> 有一個(gè) Observable sequence 發(fā)出 elements
2> map 函數(shù)提供一個(gè) '轉(zhuǎn)換閉包',對(duì)上述 elements 進(jìn)行轉(zhuǎn)換
3> 返回一個(gè)新的 Observable sequence,由轉(zhuǎn)換后的 elements 組成

(2)Diagrams

map.png
1> 初始的 elements 是: 1、2、3
2> map 函數(shù)提供轉(zhuǎn)換閉包: x => 10 * x
3> 轉(zhuǎn)換后的 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í)行結(jié)果.png

2、flatMap

(1)Definition

(2)Diagrams

flatMap.png
1> source observable 是 Observable<Int> 類(lèi)型
2> flatMap 獲取到 source obserable 的第一個(gè) element,取出 value,對(duì)其做 '乘10' 操作
3> 將轉(zhuǎn)換后的 element,重新投影到一個(gè) observable 中(即 flatMap下面的第一條線)
4> target observable 將 element 發(fā)送給 subcriber(訂閱者)
5> 之后,第一個(gè) element 的值變?yōu)?,轉(zhuǎn)換后變成40,再由 target observable 發(fā)送給 subcriber
6> 第二個(gè)、第三個(gè) element 與之類(lèi)似,不再詳述。

(3)Code

// MARK: - flatMap
func demoForFlatMap() {
    
    struct Student {
        var score: Variable<Int>
    }
    
    let disposeBag = DisposeBag()
    
    // 1 創(chuàng)建兩個(gè) Student 的實(shí)例: jack 和 rose
    let jack = Student(score: Variable(80))
    let rose = Student(score: Variable(90))
    
    // 2 創(chuàng)建一個(gè) Student 類(lèi)型的 Variable,初始值為 jack
    let student = Variable(jack)
    
    // 3 通過(guò) flatMap 訪問(wèn)到 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í)行結(jié)果.png

3、flatMapLatest

(1)Definition

(2)Diagram

flatMapLatest.png
1> 01 被 flatMapLatest 接收,將其值轉(zhuǎn)換為10,并將其投影到01的新 observable 中
2> 02 被 flatMapLatest 接收時(shí),20對(duì)應(yīng)的 observable 成為 latest observable,這個(gè)時(shí)候,即使 01 變成了 30,也不會(huì)被發(fā)送給 subcriber,因?yàn)榇藭r(shí)它不在 latest observable 中
3> 03 的情況,以此類(lèi)推

(3)Code

// MARK: - flatMapLatest
func demoForFlatMapLatest() {

struct Student {
    var score: Variable<Int>
}

let disposeBag = DisposeBag()

// 1 創(chuàng)建兩個(gè) Student 的實(shí)例: jack 和 rose
let jack = Student(score: Variable(80))
let rose = Student(score: Variable(90))

// 2 創(chuàng)建一個(gè) Student 類(lèi)型的 Variable,初始值為 jack
let student = Variable(jack)

// 3 通過(guò) flatMapLatest 訪問(wèn)到 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í)行結(jié)果.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í)行結(jié)果.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容