注意:使用本例中的代碼首先應(yīng)該導(dǎo)入頭文件,代碼如下:
import RxSwift
Combination Operators
聯(lián)合操作使多個源Observable結(jié)合成一個Observable。
startWith
在源Observable序列開始發(fā)散元素之前發(fā)散指定元素的序列。了解更多

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ā)散的。?了解更多

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ā)散出去。了解更多

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序列的最?新的元素。了解更多

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)部的元素。了解更多

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ā)出元素。