ReactiveCocoa / ReactiveSwift

Streams of values over time

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Strong reference to observer leads to signal not getting interrupted

dnadoba opened this issue · comments

Hey,

I think I found a bug, but before I dig deeper I want to make sure I'm not overlooking something obvious or if this may be even expected behaviour.
Given the following code I would expect that disposing the signal, an interrupted event would be fired:

func testSignalLifetime() {
    let signalProducerLifetimeEnded = expectation(description: "signal producer lifetime ended")
    var observerStrongRef: Signal<Void, Never>.Observer?
    let signalProducer = SignalProducer<Void, Never> { observer, lifetime in
        observerStrongRef = observer
        lifetime.observeEnded {
            signalProducerLifetimeEnded.fulfill()
        }
    }
    let signalInterrupted = self.expectation(description: "signal interrupted")
    let disposable = signalProducer.startWithSignal { signal, _ in
        signal.observeInterrupted {
            signalInterrupted.fulfill()
        }
    }
    disposable?.dispose()
    wait(for: [signalProducerLifetimeEnded, signalInterrupted], timeout: 0.1)
}

This works as long as we are not creating a strong reference to the observer like observerStrongRef does.
If we keep a strong reference to observer, signalProducerLifetimeEnded is fulfilled but signalInterrupted is not.
After removing observerStrongRef, signalInterrupted will fulfill and the test passes.

Is this a bug?
I'm using ReactiveSwift 6.6.0

Thanks
David

Okay I think I got it now.
Without a strong reference to the observer, the observer is deinitialised almost immediately which will fire an interrupted event.
Disposing a signal will not fire an interrupted event.
I thought that disposing a signal will also fire an interrupted event.

nevertheless, I have a follow up question: #821