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