注意:使用本例中的代碼首先應(yīng)該導(dǎo)入頭文件,代碼如下:
import RxSwift
Combination Operators
聯(lián)合操作使多個(gè)源Observable
結(jié)合成一個(gè)Observable
。
startWith
在源Observable
序列開(kāi)始發(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
??
??
??
??
正如這個(gè)例子所示,
startWith
體現(xiàn)了后進(jìn)先出的原則哨鸭,那就是說(shuō)民宿,每一個(gè)連續(xù)的startWith
元素將會(huì)在優(yōu)先的startWith
元素之前被考慮。
merge
合并多個(gè)源Observable
序列中的元素成為一個(gè)新的Observable
序列像鸡,并且將會(huì)發(fā)散每一個(gè)元素勘高,相當(dāng)于通過(guò)每個(gè)源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個(gè)源Observable
序列組合成一個(gè)新的Observable
序列坟桅,并且將會(huì)結(jié)合每個(gè)源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個(gè)源Observable
組合成一個(gè)新的Observable
序列,并且一旦所有源序列發(fā)出至少一個(gè)?元素以及當(dāng)任何源Observable
序列發(fā)出一個(gè)新的元素的時(shí)候仅乓,將開(kāi)始發(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**
還有一個(gè)在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
將一個(gè)Observable
序列發(fā)出的元素轉(zhuǎn)換成多個(gè)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 ---
??
??
??
??
??
在這個(gè)例子中子漩,在?把
variable.value
賦值給subject2
之后,在subject1
中添加??沒(méi)有意義石洗,因?yàn)橹挥凶罱膬?nèi)在Observable
序列 (subject2
) 將會(huì)發(fā)出元素幢泼。