RxSwift无功异步反馈系统
我在RXSwift(ReactiveX)的帮助下设计了一个调用管理器,它可以与API持续交互。调用管理器包含多个对象,这些对象本身包括一个RxSwift无功异步反馈系统,swift,reactive-programming,rx-swift,reactive,reactivex,Swift,Reactive Programming,Rx Swift,Reactive,Reactivex,我在RXSwift(ReactiveX)的帮助下设计了一个调用管理器,它可以与API持续交互。调用管理器包含多个对象,这些对象本身包括一个指示器(指示从API加载的状态信息)和控件(发送到API的请求) 在同一视图控制器中,用户可以通过GUI元素连续控制对象状态: control.onNext(commandValue) 在调用管理器中,将观察API调用的控件: control.subscribe(onNext: { (command) in // API request call })
指示器(指示从API加载的状态信息)和控件(发送到API的请求)
在同一视图控制器中,用户可以通过GUI元素连续控制对象状态:
control.onNext(commandValue)
在调用管理器中,将观察API调用的控件:
control.subscribe(onNext: { (command) in
// API request call
})
到目前为止还不错,这在反应模式下运行得很好。
现在,如果调用管理器在API交互过程中识别错误并在视图控制器中向用户显示这些错误,那么我正在寻找一个处理错误的好解决方案。我立刻想到了这样的事情:
// Call manager recognizes the error
control.onError(error)
...
// Call manager ignores errors for the subscriber
control.retry().ignoreErrors().subscribe(onNext: { (command) in
// API request call
})
...
// View controller shows the errors
indicator.subscribe(onNext: { label.stringValue = $0 })
control.subscribe(onError: { print("error", $0) })
然而,这最终会在一个无限循环中结束。
我担心我对反应式编程有一个基本的理解问题,或者我错过了一些非常重要的东西,但是我无法理解如何在这种反应式模式环境中处理错误 根据您展示的代码,您有一个很大的误解,不仅仅是关于如何处理错误,而是关于如何在总体上进行反应性编程。尝试观看此视频“”
为了回答您的具体问题,这里有两个误解:
当您调用control.onError(:)
时,这将是您能够在control
上进行的最后一次调用。一旦发出错误,它将停止工作
retry()
运算符要求其源“出错时重试”。如果它的源是确定的,那么它只会执行与以前完全相同的操作,并发出完全相同的输出(即,上次发出的错误)。对于PublishSubject
,它不知道调用OneError的原因。因此,它所能做的就是再次发出错误
P.>老实说,我认为这是API中的一个bug,因为订阅在过去某个时间发出错误的发布主题应该什么也不做。但是,你不会问为什么会有一个无限循环。相反,你会问为什么你的控件
停止发出事件。我建议你加入RxSwift slack频道,学习如何使用它的基础知识。好主意,谢谢
control.onNext(commandValue)
control.subscribe(onNext: { (command) in
// API request call
})
// Call manager recognizes the error
control.onError(error)
...
// Call manager ignores errors for the subscriber
control.retry().ignoreErrors().subscribe(onNext: { (command) in
// API request call
})
...
// View controller shows the errors
indicator.subscribe(onNext: { label.stringValue = $0 })
control.subscribe(onError: { print("error", $0) })