RxSwift无功异步反馈系统

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

我在RXSwift(ReactiveX)的帮助下设计了一个调用管理器,它可以与API持续交互。调用管理器包含多个对象,这些对象本身包括一个
指示器(指示从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) })