代码之家  ›  专栏  ›  技术社区  ›  angraankit

RxSwift-发出两次错误

  •  0
  • angraankit  · 技术社区  · 6 年前

    我一直在试验RxSwift,我正在寻找一些帮助,以正确的方式处理观察员。我有一个观察者在观察一段时间 发布主题 .

    authPublisherSubject.asObserver()
    
            .subscribe(onNext: { (status) in
    
            }, onError: { [unowned self] (error) in
    
            }, onCompleted: { [unowned self] in
    
      }).disposed(by: disposeBag)
    

    以下是观察员的职责

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

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

    如果我收到一个错误, 下一次当我订阅这个观察器的时候,即下一次当用户点击login时 由于某些原因,旧的错误被保留并 onError会自动发出旧错误。 然而,据我所知,只有那些事件会发出后发生的观察。

    2 回复  |  直到 4 年前
        1
  •  3
  •   Daniel T.    6 年前

    这里似乎有一些误解。

    首先,你不订阅 Observer Observable . 可观察的东西是可以被观察到的,观察者做观察。对我来说,一个更好的思考它的方法是 生产 价值观和观察者 消耗 他们。所以你 subscribe s。示例代码之所以有效,是因为asObserver()函数只返回 self . 那太不幸了。

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

    正如您在评论中提到的,如果发出错误,它将打破可观察链。有几种方法可以解决这个问题。第一个也是最明显的是确保链中没有任何东西会发出错误。另一种方法是将可能出错的操作符包装到平面图中,然后使用 materialize() catchError 在内部 平面图。阻止错误从flatMap转义是很重要的,因为如果它转义了,它将破坏主链。

        2
  •  -1
  •   Bhushan Mahajan    6 年前

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

    • 不,只需订阅一次。每次登录时,反复单击“订阅”,因此您会收到两次消息。为此,必须在viewWillAppear方法中添加订阅。试试这个,希望有用。