RxSwift - onError 发出两次

RxSwift - onError emitted twice

我一直在试验 RxSwift,我正在寻求一些帮助,以正确的方式处理观察者。我有一个观察者观察 Publish Subject.

authPublisherSubject.asObserver()

        .subscribe(onNext: { (status) in

        }, onError: { [unowned self] (error) in

        }, onCompleted: { [unowned self] in

  }).disposed(by: disposeBag)

以下是本观察员的职责

  1. 显示Activity指标
  2. 隐藏Activity指标
  3. 如果有错误则显示
  4. 登录成功后继续

每次用户点击登录按钮时,我都会订阅这个观察者。方法正确吗?

如果我收到错误,下次我订阅这个观察者时,即下次用户点击登录时 因为一些保留旧错误的原因并且 onError 会自动发出旧错误。 但是,据我了解 Publisher Subject 只有那些事件观察后发出的。

我无法理解这里发生了什么。

每次用户点击登录按钮时,我都会订阅这个观察者。方法正确吗?

  • 否,只需订阅一次。在每次登录时,一次又一次地单击它订阅,因此您收到了两次消息。为此,您必须在 viewWillAppear 方法中添加订阅。试试这个希望它有效。

这里似乎存在一些误解。

首先,您没有订阅 Observer,您订阅了 Observable。 Observable 是可以观察到的东西,观察者进行观察。对我来说,更好的思考方式是 Observable 产生 值,而 Observer 消耗 它们。所以你 subscribeObservables。您的示例代码有效,因为 asObserver() 函数只是 returns self。真不幸。

其次,Rx 是一种声明式的编程方法,而不是命令式的。这意味着您只设置一次 Rx 链,而不是 "every time a button is tapped." 在视图控制器的 viewDidLoad 中只设置一次订阅。现在,点击按钮不会发出错误事件,所以链中一定有你没有提到的东西出错了。

正如您在评论中提到的,如果发出错误,它将破坏可观察链。有几种方法可以处理这个问题。第一个也是最明显的是确保链中的任何东西都不会发出错误。另一种方法是将可能出错的运算符包装在 flatMap 中,然后使用 materialize()catchError within flatMap。阻止错误从 flatMap 中逃逸很重要,因为如果它逃脱了,它会破坏主链。