簡體   English   中英

RxSwift - PublishSubject - 忽略錯誤並繼續訂閱(不要處置)

[英]RxSwift - PublishSubject - Ignore error and continue subscription (do not dispose)

我找不到足夠的例子來說明如何做到這一點。

本質上,我們有一個PublishSubject ,它只是一個傳遞; 我們沒有對其進行任何操作。 我們相信,如果有任何錯誤,我們將丟棄未來的事件,因為它只是一個轉發它作為訂閱信號接收的值,不確定為什么會出現錯誤。

假設是這種情況(對 Q 的第二條評論),我們如何忽略主題上的任何錯誤並保持訂閱有效?

如果沒有選項,有沒有辦法創建一個新的訂閱onError並繼續收聽未來的.next()

let pubSubj = PublishSubject<String>()
let obs = pubSubj
    .observeOn(ConcurrentDispatchQueueScheduler(qos: .background))
    .catchError { (err) -> Observable<String> in
        print("***** catchError \(err)\n")
        return .never() // expecting this not to terminate the subscription
    }

print("***** obs: \(obs)\n")


let dispose = obs.subscribe(onNext: { (str) in
    print("***** received onNext: \(str)\n")
}, onError: { (err) in
    print("***** received onErr: \(err)\n")
}, onCompleted: {
    print("***** completed\n")
}, onDisposed: {
    print("***** onDisposed\n")
})
                    
pubSubj.on(.next("2"))
pubSubj.onError(RxError.overflow) //emits error and terminates
            
pubSubj.on(.next("3")) //is not received, how can we keep getting disposed

output:

***** obs: RxSwift.(unknown context at $1124f80f0).Catch<Swift.String>
***** received onNext: 2
***** catchError Arithmetic overflow occurred.

其他 Rx 實現似乎有onErrorResumeNext ,RxSwift 不支持。

但有答案點。 catchError ,但從我們的示例中,它仍然在錯誤之后處理並且我們沒有收到“ 3

在反應式 stream 中收到錯誤后,您將無法接收任何事件,因為 stream 將完成,這對於包括 RxSwift 在內的所有反應式庫都是如此。 catch將使用從關閉返回的Observable繼續 stream 但外部 stream 無法再次發射:

  let pubSubj = PublishSubject<String>()
  let recover = PublishSubject<String>()
  let obs = pubSubj
    .catch { _ in
      recover
    }

  print("***** obs: \(obs)\n")


  let dispose = obs.subscribe(onNext: { (str) in
    print("***** received onNext: \(str)\n")
  }, onError: { err in
    print("***** received onErr: \(err)\n")
  }, onCompleted: {
    print("***** completed\n")
  }, onDisposed: {
    print("***** onDisposed\n")
  })
                      
  pubSubj.onNext("2")
  pubSubj.onError(RxError.overflow)
  pubSubj.onNext("3") // Will not be sent
  recover.onNext("3") // Will be sent

你有幾個選擇來實現你所需要的:

  1. 不要在PublishSubject中提供錯誤。 本質上pubSubj.onError(RxError.overflow)不應該發生。
  2. 如果您需要在PublishSubject中提供錯誤,那么您可以實現它。 這樣,錯誤將作為next事件發送,並且 stream 將無法完成,例如:
  let pubSubj = PublishSubject<Event<String>>()
  let obs = pubSubj

  print("***** obs: \(obs)\n")


  let dispose = obs.subscribe(onNext: { (str) in
      print("***** received onNext: \(str)\n")
  }, onCompleted: {
      print("***** completed\n")
  }, onDisposed: {
      print("***** onDisposed\n")
  })
                      
  pubSubj.onNext(.next("2"))
  pubSubj.onNext(.error(RxError.overflow))
  pubSubj.onNext(.next("3"))

暫無
暫無

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

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