今天談一下RxSwift中的組合操作,和RAC一樣??梢詤⒄誖AC理解。
Combination Operators在RxSwift中的實(shí)現(xiàn)有五種:
- startWith
- merge
- zip
- combineLatest
- switchLatest
StartWith
在Observable釋放元素之前,發(fā)射指定的元素序列

StartWith.png
let disposeBag = DisposeBag()
Observable.of(["1","2","3"]).startWith(["0"]).subscribe({ (event) in
print(event)
}).disposed(by: disposeBag)
執(zhí)行結(jié)果如下:
next(["0"])
next(["1", "2", "3"])
completed
Merge
將多個(gè)Observable組合成單個(gè)Observable,并且按照時(shí)間順序發(fā)射對(duì)應(yīng)事件

Merge.png
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("")
subject1.onNext("")
subject2.onNext("")
subject2.onNext("??")
subject1.onNext("")
subject2.onNext("???")
??
???
zip
將多個(gè)Observable(注意:必須是要成對(duì))組合成單個(gè)Observable,當(dāng)有事件到達(dá)時(shí),會(huì)在每個(gè)序列中對(duì)應(yīng)的索引上對(duì)應(yīng)的元素發(fā)出。

zip.png
let disposeBag = DisposeBag()
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
Observable.zip(subject1, subject2) { string1,string2 in
"\(string1)--\(string2)"
}.subscribe(onNext: {print($0)}).disposed(by: disposeBag)
subject1.onNext("A")
subject1.onNext("B")
subject1.onNext("C")
subject2.onNext("1")
subject2.onNext("2")
A--1
B--2
combineLatest

combineLatest.png
當(dāng)一個(gè)項(xiàng)目由兩個(gè)Observables發(fā)射時(shí),通過一個(gè)指定的功能將每個(gè)Observable觀察到的最新項(xiàng)目組合起來,并根據(jù)該功能的結(jié)果
let disposeBag = DisposeBag()
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
Observable.combineLatest(subject1, subject2) { string1,string2 in
"\(string1)--\(string2)"
}.subscribe(onNext: {print($0)}).disposed(by: disposeBag)
subject1.onNext("A")
subject2.onNext("1")
subject2.onNext("2")
subject1.onNext("B")
subject1.onNext("C")
執(zhí)行結(jié)果:
A--1
A--2
B--2
C--2
switchLatest
切換Observable隊(duì)列

let disposeBag = DisposeBag()
let subject1 = BehaviorSubject(value: "1")
let subject2 = BehaviorSubject(value: "A")
let variable = Variable(subject1)
variable.asObservable()
.switchLatest()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
subject1.onNext("2")
subject1.onNext("3")
variable.value = subject2
subject1.onNext("4")
subject2.onNext("B")
執(zhí)行結(jié)果:
1
2
3
A
B