Skip to content

Commit 3cd964c

Browse files
authored
Merge pull request #417 from ReactiveCocoa/producer-never-fix
Precautionary `SignalProducer.never` fix.
2 parents 557dbfe + bd7f3c5 commit 3cd964c

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

Sources/SignalProducer.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,9 @@ public struct SignalProducer<Value, Error: Swift.Error> {
174174

175175
/// A producer for a Signal that never sends any events to its observers.
176176
public static var never: SignalProducer {
177-
return self.init { _ in return }
177+
return self.init { observer, lifetime in
178+
lifetime.observeEnded { _ = observer }
179+
}
178180
}
179181

180182
/// Create a `Signal` from `self`, pass it into the given closure, and start the

Tests/ReactiveSwiftTests/SignalProducerSpec.swift

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,10 +282,44 @@ class SignalProducerSpec: QuickSpec {
282282
}
283283

284284
describe("SignalProducer.never") {
285-
it("should not send any events") {
285+
it("should not send any events while still being alive") {
286286
let signalProducer = SignalProducer<Int, NSError>.never
287287

288-
expect(signalProducer).to(sendValue(nil, sendError: nil, complete: false))
288+
var numberOfEvents = 0
289+
var isDisposed = false
290+
291+
func scope() -> Disposable {
292+
defer {
293+
expect(numberOfEvents) == 0
294+
expect(isDisposed) == false
295+
}
296+
return signalProducer.on(disposed: { isDisposed = true }).start { _ in numberOfEvents += 1 }
297+
}
298+
299+
let d = scope()
300+
expect(numberOfEvents) == 0
301+
expect(isDisposed) == false
302+
303+
d.dispose()
304+
expect(numberOfEvents) == 1
305+
expect(isDisposed) == true
306+
}
307+
308+
it("should not send any events while still being alive even if the interrupt handle deinitializes") {
309+
let signalProducer = SignalProducer<Int, NSError>.never
310+
311+
var numberOfEvents = 0
312+
var isDisposed = false
313+
314+
func scope() {
315+
signalProducer.on(disposed: { isDisposed = false }).start { _ in numberOfEvents += 1 }
316+
expect(numberOfEvents) == 0
317+
expect(isDisposed) == false
318+
}
319+
320+
scope()
321+
expect(numberOfEvents) == 0
322+
expect(isDisposed) == false
289323
}
290324
}
291325

0 commit comments

Comments
 (0)