[英]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
你有幾個選擇來實現你所需要的:
PublishSubject
中提供錯誤。 本質上pubSubj.onError(RxError.overflow)
不應該發生。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.