【RxSwift】flatMapLatest、 Error事件中斷序列

RxSwift序列轉換

map

將序列每個元素轉換一遍,適合於序列內的元素類型改變,比如Bool轉換爲String, 或者其他值的操作。
輸入類型, 輸出還是類型

flapMap

將序列的元素轉換爲其他序列, 就很適合a序列轉換爲b序列,比如
輸入類型/序列, 輸出序列

flapMapLatest

和flapMap相似,不同的是隻發出最新元素

Error 序列中斷

一旦序列產生一個error,整個序列將被終止,後續監聽也就監聽不了,也包括序列轉換
Error Handling 錯誤事件處理

實例代碼:

private func createObservable() {
        
        let subject = PublishSubject<Void>()
        
        /// 使用flatMap轉換爲其他序列
        let otherOb =  subject.asObservable()
            .flatMapLatest({_ -> Observable<String> in
                print("flatMap")
                return self.netRequest()
            })
        
        // 發出一次next, 由於沒有訂閱,所以沒有效
        subject.onNext(())
        
        // 訂閱
        subject.subscribe(onNext: { (_) in
            print("發出一次事件")})
            .disposed(by: disposeBag)
        // 又發出一次事件
        subject.onNext(())
        
        // 訂閱otherOb, 之後發出的事件都可以監聽,除非序列發出Error事件
        otherOb.subscribe(onNext: { (value) in
            print("otherSub subscribe")
            print(value)})
            .disposed(by: disposeBag)
        
        // subject 發出兩次事件
        subject.onNext(()) // [1]如果在netRequet方法中拋出Error, 就會引起序列終止,下面一個發出事件也就無效。
        subject.onNext(())

    }
    
    // 模擬網絡請求
    private func netRequest() -> Observable<String> {
       return Observable<String>.create { (observer) -> Disposable in
        observer.onError(NSError(domain: "www.baidu.com", code: 30, userInfo: [:]))
//            observer.onNext("你好")
//            observer.onCompleted()
            return Disposables.create()
        }
    }

運行日誌打印

發出一次事件
發出一次事件
flatMap
Unhandled error happened: Error Domain=www.baidu.com Code=30 "(null)"
 subscription called from:

發出一次事件
發出一次事件

可以看到,如果網絡請求拋出error [1]之後的下一次next將不會轉換,同理轉換出來的序列也會中斷。
如果不發出Error只發出next和complete

   // 模擬網絡請求
    private func netRequest() -> Observable<String> {
       return Observable<String>.create { (observer) -> Disposable in
            observer.onNext("你好")
            observer.onCompleted()
            return Disposables.create()
        }
    }

打印輸出

發出一次事件
發出一次事件
flatMap
otherSub subscribe
你好
發出一次事件
flatMap
otherSub subscribe
你好

可以看到,序列沒有中斷,對應的轉換也沒有中斷。
總之
不要輕易發出Error事件,考慮到會不會終止序列和轉換。如果需要錯誤提示,採用Result也許更好。

發佈了105 篇原創文章 · 獲贊 34 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章