/ ReactiveSwift

ReactiveSwift: A very important difference between a Signal and a SignalProducer

A Property in ReactiveSwift allows us to track its changes over time.
A Property is thread-safe and observable.
A MutableProperty is a Property that can also be changed.

Frequently we will use the following pattern to expose only non-muttable property in the interface:

interface

var nonMutableProperty: Property<Bool> { get }

implementation

public var nonMutableProperty: Property< Bool> { return Property(_nonMutableProperty) }

...

fileprivate let _ nonMutableProperty: MutableProperty<Bool>

A Property exposes a signal and a producer to which we subscribe to track changes.
For example:

nonMutableProperty.producer
    .on(value: { embeddableView in
        
        log.verbose("do something")
    })
    .on(failed: { error in
        log.error(error.localizedDescription)
    })
    .start()

The difference is that the signal will only send value changes that happen after subscribing, whereas the SignalProducer creates a signal that sends the current value immediately followed by all changes later on.
In other words signal is a hot observable because like a TV broadcast it sends values even if it does not have any subscribers and as a result does not introduce any side-effects. SignalProducer is a cold observable because it is created only after it is being subscribed to.