Skip to content

Commit c56fa13

Browse files
authored
Merge pull request #513 from ReactiveCocoa/composed-property-tweak
Tweaked the composed property event delivery.
2 parents 49c65a3 + f6df0e3 commit c56fa13

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
@@ -520,10 +520,7 @@ public final class Property<Value>: PropertyProtocol {
520520
///
521521
/// - parameters:
522522
/// - unsafeProducer: The composed producer for creating the property.
523-
fileprivate init(
524-
unsafeProducer: SignalProducer<Value, NoError>,
525-
transform: ((Signal<Value, NoError>.Observer) -> Signal<Value, NoError>.Observer)? = nil
526-
) {
523+
fileprivate init(unsafeProducer: SignalProducer<Value, NoError>) {
527524
// The ownership graph:
528525
//
529526
// ------------ weak ----------- strong ------------------
@@ -535,33 +532,30 @@ public final class Property<Value>: PropertyProtocol {
535532
// strong ------------ ----------- strong ------------
536533

537534
let box = PropertyBox<Value?>(nil)
538-
var relay: Signal<Value, NoError>!
539535

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

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

557-
box.begin { storage in
558-
storage.modify { value in
559-
if let newValue = event.value {
560-
value = newValue
561-
}
546+
guard let box = box else {
547+
// Just forward the event, since no one owns the box or IOW no demand
548+
// for a cached latest value.
549+
return observer.send(event)
550+
}
551+
552+
box.begin { storage in
553+
storage.modify { value in
554+
if let newValue = event.value {
555+
value = newValue
562556
}
563-
observer.send(event)
564557
}
558+
observer.send(event)
565559
}
566560
}
567561

@@ -574,10 +568,10 @@ public final class Property<Value>: PropertyProtocol {
574568
_value = { box.value! }
575569
signal = relay
576570

577-
producer = SignalProducer { [box, signal = relay!] observer, lifetime in
571+
producer = SignalProducer { [box, relay] observer, lifetime in
578572
box.withValue { value in
579573
observer.send(value: value!)
580-
lifetime += signal.observe(Signal.Observer(mappingInterruptedToCompleted: observer))
574+
lifetime += relay.observe(Signal.Observer(mappingInterruptedToCompleted: observer))
581575
}
582576
}
583577
}

0 commit comments

Comments
 (0)