使用 RxSwift 的反应式异步反馈系统

Posted

技术标签:

【中文标题】使用 RxSwift 的反应式异步反馈系统【英文标题】:Reactive asynchronous feedback system with RxSwift 【发布时间】:2020-01-31 11:35:26 【问题描述】:

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

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

【问题讨论】:

我建议你加入 RxSwift slack 频道,学习如何使用它的基础知识。 rxslack.herokuapp.com 好建议,谢谢 【参考方案1】:

根据您展示的代码,您有一个很大的误解,不仅是关于如何处理错误,而且是关于如何进行一般的反应式编程。试试看这个视频“Reactive Programming: Why It Matters”

要回答你的具体问题,这里有两个误解:

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

    retry() 运算符要求其源“在错误时重试”。如果它的来源是确定的,那么它只会做与之前完全相同的事情并发出完全相同的输出(即,它上次发出的错误相同。)对于PublishSubject,它不知道为什么 onError 被调用。所以它所能做的最好的就是再次发出错误。

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

【讨论】:

以上是关于使用 RxSwift 的反应式异步反馈系统的主要内容,如果未能解决你的问题,请参考以下文章

系统之美——系统思考与认识系统

Neural Collaborative Filtering(神经协同过滤)

iPad要升iOS11系统吗?

TRIZ系列-创新原理-23-反馈原理

是否可以使用 PHP 异步发送电子邮件,同时向用户提供有关交付的反馈?

信号与系统3.DT 中的反馈和极点