2017-02-24 36 views
1

假設我有一個按鈕,每次點擊該按鈕我想執行網絡請求並將結果綁定到主調度器上的視圖。我還需要處理這個網絡請求可能失敗的可能性。這是我原來的想法:處理錯誤,但保持訂閱原始Observable

button.rx.tap.asObservable() 
    .flatMap(networkRequest) 
    .asDriver(onErrorRecover: handleError) 
    .drive(uiComponent) 
    .disposed(by: disposeBag) 

我希望發生的是由handleError處理一個可能的錯誤,然後再次提出請求時,該按鈕被再次選擇。這是行不通的,因爲如果發生錯誤,我現在訂閱由handleError返回的Driver。我唯一的想法是保持信號Observable並在subscribe中單獨處理錯誤情況和下一個情況。這也將需要observeOn。我希望有一些比這更優雅的東西。有沒有人有這種用例的替代方法?

編輯

我還要提到的是爲我們工作的一種方法是處理錯誤的flatMap

button.rx.tap.asObservable() 
    .flatMap { 
    return networkRequest() 
     .catchError(handleError) 
    } 
    .asDriver(onErrorDriveWith: Driver.empty()) 
    .drive(uiComponent) 
    .disposed(by: disposeBag) 

但是,它再次顯得不如我想象的那麼優雅。

回答

0

我將使用Result類型來包裝返回結果和可能發生的錯誤。

可以轉換爲Result輸入您networkRequest()方法

+0

感謝您的答覆。然而,我相信如果我們將錯誤包裝在一個'Result'中,它只能實現與不轉換爲'Driver'相同的功能,並且在訂閱Observable時處理'next'和'error'事件的方式不同。 –

+1

是的,我知道你想達到什麼,但我曾嘗試過,但沒有像你一樣想出一個好的解決方案。 我結束了對我來說最合適的「結果」方式。 我相信有'onErrorResumeNext'運算符,這是我們都想要的,但遺憾的是這個運算符不可用在'RxSwift'中 –