RxSwiftExt icon indicating copy to clipboard operation
RxSwiftExt copied to clipboard

Name of method `ignoreErrors` break contract of `PublishSubject`

Open ajjnix opened this issue 6 years ago • 1 comments

PublishSubject is not working with ignoreErrors function because ignoreErrors is synonym of retry. But PublishSubject can't retry by contract cause it's not operation.

        let subject = PublishSubject<Int>()
        _ = subject.ignoreErrors().subscribe(onNext: {
            print($0)
        })
        subject.onNext(1)
        subject.onError(RxError.unknown)
        subject.onNext(2)
        subject.onNext(3)

// output: INFINIRY_LOOP

In this code I can think the sequence can't terminated on error (and yes it's not terminated 😺) but it's not right by contract of Observable. So I think this operator is mislead and I suggest to remove it.

ajjnix avatar Jun 06 '19 12:06 ajjnix

You can't technically do anything against the contract.

The stream isn't terminated because ignoreErrors is just an alias to retry - by infinitely retrying the error'd stream, you are stuck in an infinite loop.

What we can do is change the documentation perhaps. I also think the naming is a bit misleading, because you're not exactly ignoring errors. Ignoring errors would be something like materialize, filtering errors and dematerialize.

@fpillet your thoughts?

freak4pc avatar Jun 06 '19 13:06 freak4pc