五、聯(lián)合操作-Combination Operators(Rx.playground翻譯)

注意:使用本例中的代碼首先應(yīng)該導(dǎo)入頭文件,代碼如下:

import RxSwift

Combination Operators

聯(lián)合操作使多個源Observable結(jié)合成一個Observable。

startWith

在源Observable序列開始發(fā)散元素之前發(fā)散指定元素的序列。了解更多

image

example("startWith") {
    let disposeBag = DisposeBag()

    Observable.of("??", "??", "??", "??")
        .startWith("1")
        .startWith("2")
        .startWith("3", "A", "B")
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}

Debug Area 輸出:
--- startWith example ---
3
A
B
2
1
??
??
??
??

正如這個例子所示,startWith體現(xiàn)了后進(jìn)先出的原則,那就是說,每一個連續(xù)的startWith元素將會在優(yōu)先的startWith元素之前被考慮。


merge

合并多個源Observable序列中的元素成為一個新的Observable序列,并且將會發(fā)散每一個元素,相當(dāng)于通過每個源Observable序列發(fā)散的。?了解更多

image

example("merge") {
    let disposeBag = DisposeBag()

    let subject1 = PublishSubject<String>()
    let subject2 = PublishSubject<String>()

    Observable.of(subject1, subject2)
        .merge()
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

    subject1.onNext("A")
   subject1.onNext("B")
   subject2.onNext("①")
   subject2.onNext("②")
   subject1.onNext("??")
   subject2.onNext("③")
}

Debug Area 輸出:
--- merge example ---
A
B


??


zip

將多達(dá)8個源Observable序列組合成一個新的Observable序列,并且將會結(jié)合每個源Observable序列中一致的索引位置的元素從新的Observable序列中發(fā)散出去。了解更多

image

example("zip") {
    let disposeBag = DisposeBag()

    let stringSubject = PublishSubject<String>()
    let intSubject = PublishSubject<Int>()

    Observable.zip(stringSubject, intSubject) { stringElement, intElement in
        "\(stringElement) \(intElement)"
        }
        .subscribeNext { print($0) }
        .disposed(by: disposeBag)

    stringSubject.onNext("A")
   stringSubject.onNext("B")

   intSubject.onNext(1)
   intSubject.onNext(2)

   stringSubject.onNext("??")
   intSubject.onNext(3)
}

Debug Area 輸出:
--- zip example ---
A ** 1**
?B ** 2**
?? ** 3**


combineLatest

將多達(dá)8個源Observable組合成一個新的Observable序列,并且一旦所有源序列發(fā)出至少一個?元素以及當(dāng)任何源Observable序列發(fā)出一個新的元素的時候,將開始發(fā)散組合的Observable序列的最?新的元素。了解更多

image

example("combineLatest") {
    let disposeBag = DisposeBag()

    let stringSubject = PublishSubject<String>()
    let intSubject = PublishSubject<Int>()

    Observable.combineLatest(stringSubject, intSubject) { stringElement, intElement in
        "\(stringElement) \(intElement)"
        }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

    stringSubject.onNext("A")
   stringSubject.onNext("B")

   intSubject.onNext(1)
   intSubject.onNext(2)

   stringSubject.onNext("??")
}

Debug Area 輸出:
--- combineLatest example ---
A ** 1**
?B ** 2**
A?B ** 2**

還有一個在Array之上的combineLatest擴(kuò)展:

example("Array.combineLatest") {
    let disposeBag = DisposeBag()

    let stringObservable = Observable.just("??")
    let fruitObservable = Observable.from(["??", "??", "??"])
    let animalObservable = Observable.of("??", "??", "??", "??")

    [stringObservable, fruitObservable, animalObservable].combineLatest {
            "\($0[0]) \($0[1]) \($0[2])"
        }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}

Debug Area 輸出:
--- Array.combineLatest example ---
??** ?? ??
??
?? ??
??
?? ??
??
?? ??
??
?? ??
??
?? **??

Array之上的combineLatest擴(kuò)展要求所有源Observable序列的類型是相同的。


switchLatest

將一個Observable序列發(fā)出的元素轉(zhuǎn)換成多個Observable序列,并且發(fā)出最近的Observable序列內(nèi)部的元素。了解更多

image

example("switchLatest") {
    let disposeBag = DisposeBag()
    
    let subject1 = BehaviorSubject(value: "??")
    let subject2 = BehaviorSubject(value: "??")

    let variable = Variable(subject1)

    variable.asObservable()
        .switchLatest()
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

    subject1.onNext("??")
    subject1.onNext("??")

    variable.value = subject2

    subject1.onNext("??")

    subject2.onNext("??")
}

Debug Area 輸出:
--- switchLatest example ---
??
??
??
??
??

在這個例子中,在?把variable.value賦值給subject2之后,在subject1中添加??沒有意義,因為只有最近的內(nèi)在Observable序列 (subject2) 將會發(fā)出元素。


下一篇: 六、?轉(zhuǎn)變操作-Transforming Operators(Rx.playground翻譯)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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