Skip to content

Commit f6df0e3

Browse files
committed
Tweaked the composed property event delivery.
1 parent a54815f commit f6df0e3

File tree

1 file changed

+19
-25
lines changed

1 file changed

+19
-25
lines changed

Sources/Property.swift

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -522,10 +522,7 @@ public final class Property<Value>: PropertyProtocol {
522522
///
523523
/// - parameters:
524524
/// - unsafeProducer: The composed producer for creating the property.
525-
fileprivate init(
526-
unsafeProducer: SignalProducer<Value, NoError>,
527-
transform: ((Signal<Value, NoError>.Observer) -> Signal<Value, NoError>.Observer)? = nil
528-
) {
525+
fileprivate init(unsafeProducer: SignalProducer<Value, NoError>) {
529526
// The ownership graph:
530527
//
531528
// ------------ weak ----------- strong ------------------
@@ -537,33 +534,30 @@ public final class Property<Value>: PropertyProtocol {
537534
// strong ------------ ----------- strong ------------
538535

539536
let box = PropertyBox<Value?>(nil)
540-
var relay: Signal<Value, NoError>!
541537

542-
unsafeProducer.startWithSignal { upstream, interruptHandle in
543-
// A composed property tracks its active consumers through its relay signal, and
544-
// interrupts `unsafeProducer` if the relay signal terminates.
545-
let (signal, _observer) = Signal<Value, NoError>.pipe(disposable: interruptHandle)
546-
let observer = transform?(_observer) ?? _observer
547-
relay = signal
538+
// A composed property tracks its active consumers through its relay signal, and
539+
// interrupts `unsafeProducer` if the relay signal terminates.
540+
let disposable = SerialDisposable()
541+
let (relay, observer) = Signal<Value, NoError>.pipe(disposable: disposable)
548542

543+
disposable.inner = unsafeProducer.start { [weak box] event in
549544
// `observer` receives `interrupted` only as a result of the termination of
550545
// `signal`, and would not be delivered anyway. So transforming
551546
// `interrupted` to `completed` is unnecessary here.
552-
upstream.observe { [weak box] event in
553-
guard let box = box else {
554-
// Just forward the event, since no one owns the box or IOW no demand
555-
// for a cached latest value.
556-
return observer.send(event)
557-
}
558547

559-
box.begin { storage in
560-
storage.modify { value in
561-
if let newValue = event.value {
562-
value = newValue
563-
}
548+
guard let box = box else {
549+
// Just forward the event, since no one owns the box or IOW no demand
550+
// for a cached latest value.
551+
return observer.send(event)
552+
}
553+
554+
box.begin { storage in
555+
storage.modify { value in
556+
if let newValue = event.value {
557+
value = newValue
564558
}
565-
observer.send(event)
566559
}
560+
observer.send(event)
567561
}
568562
}
569563

@@ -576,10 +570,10 @@ public final class Property<Value>: PropertyProtocol {
576570
_value = { box.value! }
577571
signal = relay
578572

579-
producer = SignalProducer { [box, signal = relay!] observer, lifetime in
573+
producer = SignalProducer { [box, relay] observer, lifetime in
580574
box.withValue { value in
581575
observer.send(value: value!)
582-
lifetime += signal.observe(Signal.Observer(mappingInterruptedToCompleted: observer))
576+
lifetime += relay.observe(Signal.Observer(mappingInterruptedToCompleted: observer))
583577
}
584578
}
585579
}

0 commit comments

Comments
 (0)