采用 RxSwift 的响应式异步反馈系统



我正在RXSwift(ReactiveX(的帮助下设计一个呼叫管理器,它与API持续交互。调用管理器包括多个对象,这些对象本身包括indicator(指示从 API 加载的状态信息(和control(要发送到 API 的请求(。

class CallManagerObjectA() {
var control = PublishSubject<String>()
var indicator = BehaviorSubject<String>(value: "string status")
}

在呼叫管理器中,调度程序定期为可观察指标提供新值:

<... API response ...>
indicator.onNext(newValue)

在视图控制器的其他地方,将观察标签的指示器:

indicator.subscribe(onNext: { label.stringValue = $0 })

在同一视图控制器中,用户可以通过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) })

然而,这最终会陷入无限循环。 我担心我对响应式编程有一个基本的理解问题,或者我错过了一些非常重要的东西,但我无法理解在这个响应式模式环境中如何处理错误。

根据你展示的代码,你有一个很大的误解,不仅仅是如何处理错误,还有一般的如何反应式编程。尝试观看此视频"响应式编程:为什么重要">

为了回答您的具体问题,这里有两个误解:

  1. 当您拨打control.onError(_:)电话时,这将是您在control上拨打的最后一个电话。一旦发出错误,它将停止工作。

  2. retry()运算符要求其源"在错误时重试"。如果它的源是确定的,那么它将只做与之前完全相同的事情并发出完全相同的输出(即,它上次发出的相同错误(。在PublishSubject的情况下,它不知道为什么调用onError。因此,它能做的最好的事情就是再次发出错误。

老实说,我认为这是 API 中的一个错误,因为订阅在过去某个时候发出错误的发布主题应该什么都不做。但是,你不会问为什么你会得到一个无限循环。相反,你会问为什么你的control停止发出事件。

最新更新