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