我一直在尝试RxSwift,并且正在寻找一些正确的方法来与观察者打交道。我有一位观察员,负责观察 发布主题 。
authPublisherSubject.asObserver()
.subscribe(onNext: { (status) in
}, onError: { [unowned self] (error) in
}, onCompleted: { [unowned self] in
}).disposed(by: disposeBag)
以下是该观察员的职责
每当用户点击“登录按钮”时,我都会订阅此观察者。方法正确吗?
如果收到错误消息,则 下一次我订阅该观察者时,即下次用户单击登录名 时,由于某些原因,会保留旧错误,并且< strong> onError会自动发出并带有旧错误。 。但是,据我了解,Publisher Subject仅会发出那些在观察后发生的事件。
我不明白这是怎么回事。
答案 0 :(得分:3)
这里似乎存在一些误解。
首先,您没有订阅Observer
,而是订阅了Observable
。可观察者是可以观察的东西,观察者可以观察。对我而言,更好的思考方式是,一个Observable 产生值,而Observer 消耗。因此,您subscribe
至Observable
个。您的示例代码有效,因为asObserver()函数仅返回self
。真不幸。
第二,Rx是一种声明式编程方法,不是强制性的。这意味着您只需一次设置Rx链,而不是“每次点击按钮”。在视图控制器的viewDidLoad中仅设置一次订阅。现在,点击按钮不会发出错误事件,因此,在您尚未提及的链中一定有一些错误了。
正如您在评论中提到的那样,如果发出错误,它将破坏可观察的链条。有几种方法可以解决此问题。首先也是最明显的是确保链中没有任何东西可以发出错误。另一种方法是将可能出错的运算符包装在flatMap中,然后在flatMap中使用materialize()
或catchError
。阻止错误转义flatMap非常重要,因为如果这样做,它将破坏主链。
答案 1 :(得分:-1)
每当用户单击“登录按钮”时,我都会订阅此观察者。方法正确吗?