目錄:
RxSwift - 入門
RxSwift Observable Create
RxSwift Subject
RxSwift Combination Operators
RxSwift Transforming Operators
RxSwift Filterning and conditional operators
RxSwift Mathematical and aggregate operators
RxSwift Connectable Operators
RxSwift ErrorHandding Operators
RxSwift Debug Operators
Demo地址
Combination Operators
在了解了Observable和Subject之后,我們來看看與之搭配使用的Operators有哪些,如果說之前是在游戲里面創(chuàng)建角色,那么Operators就是我們的神器了,一刀99級有木有。
StartWith
會在事件隊列前插入固定數(shù)量的元素
example("startWith") {
let bag = DisposeBag()
Observable.of("??", "??", "??", "??")
.startWith("1??")
.startWith("2??")
.subscribe(onNext: { print($0) })
.disposed(by: bag)
}

Merge
把多個Observable合并成為一個新的Observable,當(dāng)任意一個被組合的Observable發(fā)生新事件都會發(fā)事件值發(fā)送出來,如果有任意一個Observable發(fā)生了onError事件,那么整個Observable都不會往下執(zhí)行了
example("merge") {
let bag = DisposeBag()
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
Observable.of(subject1, subject2)
.merge()
.subscribe(onNext: { print($0) })
.disposed(by: bag)
subject1.onNext("???")
subject1.onNext("???")
subject2.onNext("①")
subject2.onNext("②")
subject1.onNext("??")
subject2.onNext("③")
}

Zip
把多個Observable組合成為一個新的Observable,只有當(dāng)組合中的每一個Observable都發(fā)生了OnNext事件,才會發(fā)送事件出來,如果組合中有任意Observable發(fā)生了onError、onCompleted、dispose事件,Zip之后的Observable也會結(jié)束
Zip最多支持8個Observable
example("zip") {
let bag = DisposeBag()
let stringSubject = PublishSubject<String>()
let intSubject = PublishSubject<Int>()
Observable.zip(stringSubject, intSubject) { stringElement, intElement in
"\(stringElement) \(intElement)"
}
.subscribe(onNext: { print($0) })
.disposed(by: bag)
stringSubject.onNext("???")
stringSubject.onNext("???")
intSubject.onNext(1)
intSubject.onNext(2)
// stringSubject.onError(TestError.test)
// stringSubject.onCompleted()
// stringSubject.dispose()
stringSubject.onNext("??")
intSubject.onNext(3)
}

combineLatest
combineLatest有兩個初始化方法一個接收固定數(shù)量Observable,一個接收一個數(shù)組。
兩者的區(qū)別就是數(shù)組的那個只能傳同類型的的Observable,接收固定數(shù)量的Observable則可以處理不同類型的Observable
combineLatest和Zip類似,不同之處是不需要等待組合中的Observable都是最新的事件才會發(fā)送事件,而是當(dāng)有一個Observable有新的事件之后就會進(jìn)行發(fā)送事件,其中任意一個Observable調(diào)用了dispose或者completed事件都不會影響到新的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("???")
intSubject.onNext(1)
stringSubject.onNext("???")
intSubject.onNext(2)
// stringSubject.onError(TestError.test)
// stringSubject.onCompleted()
// stringSubject.dispose()
stringSubject.onNext("??")
intSubject.onNext(3)
}

switchLatest
選擇最后一個Observable
example("switchLatest") {
let bag = DisposeBag()
let subject1 = BehaviorSubject(value: "??")
let subject2 = BehaviorSubject(value: "??")
let variable = Variable(subject1)
variable.asObservable()
.switchLatest()
.subscribe(onNext: { print($0) })
.disposed(by: bag)
subject1.onNext("??")
subject1.onNext("??")
variable.value = subject2
subject1.onNext("??")
subject2.onNext("??")
}

根據(jù)圖中可以看出,當(dāng)切換了Observable之后,之前的Observable的事件就不會再new Observable中發(fā)生了,所以上面的代碼打印的結(jié)果是:
---------- switchLatest ----------
??
??
??
??
??