RxSwift筆記 - Combining Observables


CombineLatest

當兩個Observables中的任何一個發射了數據時,使用一個函數結合每個Observable發射的最近數據項,並且基於這個函數的結果發射數據。

combineLatest.png

let first = PublishSubject<String>()
let second = PublishSubject<String>()

Observable.combineLatest(first, second) { $0 + $1 }
    .subscribe(onNext: {
    print($0)
}).disposed(by: disposeBag)

first.onNext("1")
second.onNext("A")
second.onNext("B")
first.onNext("2")
second.onNext("C")
second.onNext("D")
second.onNext("E")
first.onNext("3")
first.onNext("4")

/*
 1A
 1B
 2B
 2C
 2D
 2E
 3E
 4E
 */

Merge

將多個 Observables 合併成一個

merge.png

let intSubject = PublishSubject<String>()
let strSubject = PublishSubject<String>()

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


intSubject.onNext("1")
strSubject.onNext("A")
strSubject.onNext("B")
intSubject.onNext("2")
strSubject.onNext("C")
strSubject.onNext("D")
strSubject.onNext("E")
intSubject.onNext("3")
intSubject.onNext("4")

/*
 1
 A
 B
 2
 C
 D
 E
 3
 4
 */

StartWith

將一些元素插入到序列的頭部

startWith.png

let disposeBag = DisposeBag()

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

/*
1
2
3
A
B
C
D
E
*/ 

SwitchLatest

將一個發射多個Observables的Observable轉換成另一個單獨的Observable,後者發射那些Observables最近發射的數據項

switch.c.png

let disposeBag = DisposeBag()

let subject1 = BehaviorSubject(value: "A")
let subject2 = BehaviorSubject(value: "1")

let variable = Variable(subject1)

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

subject1.onNext("B")
subject1.onNext("C")

//改變事件源
variable.value = subject2
subject1.onNext("D")
subject2.onNext("2")

//改變事件源
variable.value = subject1
subject2.onNext("3")
subject1.onNext("E")

/*
A
B
C
1
2
3
E
*/

Zip

通過一個函數將多個 Observables 的元素組合起來,然後將每一個組合的結果發出來

是由每一個源 Observables 的第一個元素組合出來的。它的第二個元素 ,是由每一個源 Observables 的第二個元素組合出來的。它的第三個元素 ,是由每一個源 Observables 的第三個元素組合出來的,以此類推。它的元素數量等於源 Observables 中元素數量最少的那個。

zip.png

let disposeBag = DisposeBag()
let first = PublishSubject<String>()
let second = PublishSubject<String>()

Observable.zip(first, second) { $0 + $1 }
          .subscribe(onNext: { print($0) })
          .disposed(by: disposeBag)

first.onNext("1")
second.onNext("A")
first.onNext("2")
second.onNext("B")
second.onNext("C")
second.onNext("D")
first.onNext("3")
first.onNext("4")

/*
1A
2B
3C
4D
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章