почему я не могу поддерживать наблюдаемость живой после .onError (), даже если я уже использую обработку ошибок, например .catchError () onRxSwift? - PullRequest
1 голос
/ 28 июня 2019

Итак, я хочу сохранить наблюдаемое в действии (не выбрасывая) даже после ввода onError(), чтобы я мог ввести onNext()

Я уже подписан на этот ответ

, добавив .catchError() или .catchErrorReturn(), но это не сработало так, как я ожидал

(примечание: я запускаю этот код на детской площадке)

    let bag = DisposeBag()
    let data = PublishSubject<Observable<Int>>()
    data.debug("debug").flatMap({
        $0.map({data in
            return data
        }).catchError({err in
            return Observable.empty()
        })
    }).subscribe(onNext:{
        print($0)
    },onCompleted:{
        print("end")
    }).disposed(by: bag)
    let inputData = PublishSubject<Int>()
    data.onNext(inputData)
    inputData.onNext(1)
    inputData.onNext(2)
    inputData.onError(MyError.anError)
    inputData.onNext(2)

фактический результат я получаю

1
2

ожидаемый результат, который я хочу

1
2
2

1 Ответ

1 голос
/ 28 июня 2019

Как только вы вставите ошибку в ваш inputData, это будет сделано и больше не будет излучать ничего. (полная остановка) Это контракт Observable, и отлов ошибки из другого Observable не меняет этого.

Подробнее о наблюдаемом контракте , в котором говорится:

После отправки уведомления OnCompleted или OnError, после этого он не может отправлять дальнейшие уведомления .

[стресс мой]


Как я уже упоминал в комментариях: То, что наблюдаемое больше не сможет излучать что-либо, и любые подписки на него будут удаляться. Тем не менее, единственная подписка на него изнутри flatMap. Ваш субъект данных все еще сможет излучать больше.

например:

let bag = DisposeBag()
let data = PublishSubject<Observable<Int>>()

data
    .debug("debug")
    .flatMap {
        $0.catchError { _ in Observable.empty() }
    }
    .subscribe(
        onNext: { print($0) },
        onCompleted: { print("end") }
    )
    .disposed(by: bag)

let inputData1 = PublishSubject<Int>()

data.onNext(inputData1)
inputData1.onNext(1)
inputData1.onNext(2)
inputData1.onError(MyError.anError)

let inputData2 = PublishSubject<Int>()
data.onNext(inputData2)
inputData2.onNext(2)

Распечатает:

debug -> subscribed
debug -> Event next(RxSwift.PublishSubject<Swift.Int>)
1
2
debug -> Event next(RxSwift.PublishSubject<Swift.Int>)
2
...