簡體   English   中英

RxSwift-onError發出兩次

[英]RxSwift - onError emitted twice

我一直在嘗試RxSwift,並且正在尋找一些正確的方法來與觀察者打交道。 我有一個觀察者,負責觀察發布主題

authPublisherSubject.asObserver()

        .subscribe(onNext: { (status) in

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

        }, onCompleted: { [unowned self] in

  }).disposed(by: disposeBag)

以下是該觀察員的職責

  1. 顯示活動指示器
  2. 隱藏活動指示器
  3. 顯示錯誤(如果有)
  4. 如果登錄成功則繼續

每當用戶點擊“登錄按鈕”時,我都會訂閱此觀察者。 方法正確嗎?

如果我收到錯誤,則下次我訂閱該觀察者時,即下次由於某種原因用戶單擊登錄時,將保留舊錯誤,並且會自動發送onError並顯示舊錯誤。 但是,據我了解,Publisher Subject僅會發出那些在觀察后發生的事件。

我不明白這是怎么回事。

這里似乎存在一些誤解。

首先,您不訂閱Observer ,而是訂閱Observable 可觀察者是可以觀察的東西,觀察者可以觀察。 對我來說,一個更好的辦法去想它是可觀察到的生產值,並觀察它們消耗 因此,您subscribeObservable 您的示例代碼有效,因為asObserver()函數僅返回self 那真不幸。

其次,Rx是一種聲明式編程方法,不是強制性的。 這意味着你設置在Rx鏈中只有一次,而不是“每一個按鈕被竊聽的時間。” 在視圖控制器的viewDidLoad中僅設置一次訂閱。 現在,按鈕點擊不會發出錯誤事件,因此在您尚未提及的鏈中一定有一些錯誤。

正如你在留言中提到,如果有錯誤時發出,這將打破觀察到鏈。 有幾種方法可以解決此問題。 首先也是最明顯的是確保鏈中沒有任何東西可以發出錯誤。 另一種方法是包裹可在flatMap錯誤輸出,然后或者使用操作materialize()catchError的flatMap 它從逃避flatMap停止錯誤,因為如果這樣做,它會打破主鏈是非常重要的。

每當用戶點擊“登錄按鈕”時,我都會訂閱此觀察者。 方法正確嗎?

  • 不,只需要訂閱一次。 每次登錄時,單擊一次又一次訂閱,因此您兩次收到消息。 為此,您必須在viewWillAppear方法中添加訂閱。 嘗試這種希望能奏效的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM