RxSwift-onError发出两次

时间:2018-10-06 20:48:40

标签: ios swift reactive-programming rx-swift

我一直在尝试RxSwift,并且正在寻找一些正确的方法来与观察者打交道。我有一位观察员,负责观察 发布主题

authPublisherSubject.asObserver()

        .subscribe(onNext: { (status) in

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

        }, onCompleted: { [unowned self] in

  }).disposed(by: disposeBag)

以下是该观察员的职责

  1. 显示活动指示器
  2. 隐藏活动指示器
  3. 显示错误
  4. 如果登录成功则继续

每当用户点击“登录按钮”时,我都会订阅此观察者。方法正确吗?

如果收到错误消息,则 下一次我订阅该观察者时,即下次用户单击登录名 时,由于某些原因,会保留旧错误,并且< strong> onError会自动发出并带有旧错误。 。但是,据我了解,Publisher Subject仅会发出那些在观察后发生的事件。

我不明白这是怎么回事。

2 个答案:

答案 0 :(得分:3)

这里似乎存在一些误解。

首先,您没有订阅Observer,而是订阅了Observable。可观察者是可以观察的东西,观察者可以观察。对我而言,更好的思考方式是,一个Observable 产生值,而Observer 消耗。因此,您subscribeObservable个。您的示例代码有效,因为asObserver()函数仅返回self。真不幸。

第二,Rx是一种声明式编程方法,不是强制性的。这意味着您只需一次设置Rx链,而不是“每次点击按钮”。在视图控制器的viewDidLoad中仅设置一次订阅。现在,点击按钮不会发出错误事件,因此,在您尚未提及的链中一定有一些错误了。

正如您在评论中提到的那样,如果发出错误,它将破坏可观察的链条。有几种方法可以解决此问题。首先也是最明显的是确保链中没有任何东西可以发出错误。另一种方法是将可能出错的运算符包装在flatMap中,然后在flatMap中使用materialize()catchError 。阻止错误转义flatMap非常重要,因为如果这样做,它将破坏主链。

答案 1 :(得分:-1)

每当用户单击“登录按钮”时,我都会订阅此观察者。方法正确吗?

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