温馨提示:本文翻译自stackoverflow.com,查看原文请点击:swift - Reactive asynchronous feedback system with RxSwift

swift - 具有RxSwift的无功异步反馈系统

发布于 2020-03-31 23:26:17

我在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) })

但是,这最终导致无限循环。我担心我对反应式编程有一个基本的理解问题,或者我错过了一些非常重要的内容,但是我无法理解这种反应式环境中的句柄错误。

查看更多

提问者
Maschina
被浏览
11
Daniel T. 2020-02-01 21:23

根据所显示的代码,您不仅对如何处理错误,而且对如何进行反应式编程都有很大的误解。尝试观看此视频“ 反应性编程:为什么重要

要回答您的特定问题,这里有两个误解:

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

  2. retry()运营商要求其源“上的错误重试”。如果它的来源是确定的,则它将执行与之前完全相同的操作并发出完全相同的输出(即,上次发出的相同错误。)对于a PublishSubject,它不知道为什么onError是叫。因此,最好的办法就是再次发出错误。

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