@@ -15,6 +15,8 @@ public final class ColdSignal<Value, ErrorType: Error>: ColdSignalType, Internal
1515
1616 private var cancelDisposable : Disposable ?
1717
18+ private var handlerDisposable : Disposable ?
19+
1820 private var started = false
1921
2022 /// Initializes a ColdSignal that will invoke the given closure at the
@@ -39,31 +41,28 @@ public final class ColdSignal<Value, ErrorType: Error>: ColdSignalType, Internal
3941 /// with the signal and immediately send an `Interrupted` event.
4042
4143 public func start( ) {
42- let observer = Observer < Value , ErrorType > { event in
43- if case . Interrupted = event {
44-
45- self . interrupt ( )
46-
47- } else {
44+ if !started {
45+ started = true
46+
47+ let observer = Observer < Value , ErrorType > { event in
48+ // Pass event downstream
4849 self . observers. forEach { ( observer) in
4950 observer. action ( event)
5051 }
5152
53+ // If event is terminating dispose of the handlerDisposable.
5254 if event. isTerminating {
53- self . stop ( )
55+ self . handlerDisposable ? . dispose ( )
5456 }
5557 }
56- }
57-
58- if !started {
59- started = true
60- let handlerDisposable = startHandler ( observer)
58+
59+ handlerDisposable = startHandler ( observer)
6160
6261 // The cancel disposable should send interrupted and then dispose of the
6362 // disposable produced by the startHandler.
64- cancelDisposable = ActionDisposable {
63+ cancelDisposable = ActionDisposable { [ weak self ] in
6564 observer. sendInterrupted ( )
66- handlerDisposable? . dispose ( )
65+ self ? . handlerDisposable? . dispose ( )
6766 }
6867 }
6968 }
0 commit comments