2017-02-24 38 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'中 –