RxSwift Combination Operators

目錄:

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

在了解了ObservableSubject之后,我們來看看與之搭配使用的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)
        }
StartWith.png

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("③")
        }
Merge.png

Zip

把多個Observable組合成為一個新的Observable,只有當(dāng)組合中的每一個Observable都發(fā)生了OnNext事件,才會發(fā)送事件出來,如果組合中有任意Observable發(fā)生了onError、onCompleteddispose事件,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)
        }
Zip.png

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)
        }
combineLatest.png

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("??")
        }
SwitchLatest.png

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

---------- switchLatest ----------
??
??
??
??
??
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容