@@ -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