Skip to content

Commit 3d5e7c3

Browse files
committed
Fixed an interrupt issue.
1 parent 82435b9 commit 3d5e7c3

File tree

2 files changed

+19
-26
lines changed

2 files changed

+19
-26
lines changed

Sources/ColdSignal.swift

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

Sources/Signal.swift

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,12 @@ public final class Signal<Value, ErrorType: Error>: SignalType, InternalSignalTy
2424
let generatorDisposable = SerialDisposable()
2525

2626
let inputObserver = Observer<Value, ErrorType> { event in
27-
if case .Interrupted = event {
28-
29-
self.interrupt()
30-
31-
} else {
32-
self.observers.forEach { (observer) in
33-
observer.action(event)
34-
}
35-
36-
if event.isTerminating {
37-
generatorDisposable.dispose()
38-
}
27+
self.observers.forEach { (observer) in
28+
observer.action(event)
29+
}
30+
31+
if event.isTerminating {
32+
generatorDisposable.dispose()
3933
}
4034
}
4135

0 commit comments

Comments
 (0)