2.0.0 alpha 1
Pre-releaseThis is the first alpha release of ReactiveSwift 2.0. It requires Swift 3.1 (Xcode 8.3).
Changes
Modified Signal lifetime semantics (#355)
The Signal lifetime semantics is modified to improve interoperability with memory debugging tools. ReactiveSwift 2.0 adopted a new Signal internal which does not exploit deliberate retain cycles that consequentially confuse memory debugging tools.
A Signal is now automatically and silently disposed of, when:
- the
Signalis not retained and has no active observer; or - (New) both the
Signaland its input observer are not retained.
It is expected that memory debugging tools would no longer report irrelevant negative leaks that were once caused by the ReactiveSwift internals.
SignalProducer resource management (#334)
SignalProducer now uses Lifetime for resource management. You may observe the Lifetime for the disposal of the produced Signal.
let producer = SignalProducer<Int, NoError> { observer, lifetime in
if let disposable = numbers.observe(observer) {
lifetime.observeEnded(disposable.dispose)
}
}Two Disposable-accepting methods Lifetime.Type.+= and Lifetime.add are provided to aid migration, and are subject to removal in a future release.
Signal and SignalProducer
-
All
SignalandSignalProduceroperators now belongs to the respective concrete types. (#304)Custom operators should extend the concrete types directly.
SignalProtocolandSignalProducerProtocolshould be used only for constraining associated types. -
combineLatestandzipare optimised to have a constant overhead regardless of arity, mitigating the possibility of stack overflow. (#345) -
flatMap(_:transform:)is renamed toflatMap(_:_:). (#339) -
promoteErrors(_:)is renamed topromoteError(_:). (#408) -
Eventis renamed toSignal.Event. (#376) -
Observeris renamed toSignal.Observer. (#376)
Action
Action(input:_:),Action(_:),Action(enabledIf:_:)andAction(state:enabledIf:_:)are renamed toAction(state:execute:),Action(execute:),Action(enabledIf:execute:)andAction(state:enabledIf:execute:)respectively. (#325)
Properties
- The memory overhead of property composition has been considerably reduced. (#340)
Bindings
-
The
BindingSourcenow requires only a producer representation ofself. (#359) -
The
<~operator overloads are now provided byBindingTargetProvider. (#359)
Disposables
-
SimpleDisposableandActionDisposablehas been folded intoAnyDisposable. (#412) -
CompositeDisposable.DisposableHandleis replaced byDisposable?. (#363) -
The
+=operator overloads forCompositeDisposableare now hosted inside the concrete types. (#412)
Bag
Schedulers
Schedulergains a class bound. (#333)
Lifetime
Lifetime.endednow uses the inhabitableNeveras its value type. (#392)
Atomic
SignalandAtomicnow useos_unfair_lockwhen it is available. (#342)
Additions
-
FlattenStrategy.raceis introduced. (#233, kudos to @inamiy)raceflattens whichever inner signal that first sends an event, and ignores the rest. -
FlattenStrategy.concurrentis introduced. (#298, kudos to @andersio)concurrentstarts and flattens inner signals according to the specified concurrency limit. If an inner signal is received after the limit is reached, it would be queued and drained later as the in-flight inner signals terminate. -
New operators:
reduce(into:)andscan(into:). (#365, kudos to @ikesyo)These variants pass to the closure an
inoutreference to the accumulator, which helps the performance when a large value type is used, e.g. collection. -
Property(initial:then:)gains overloads that accept a producer or signal of the wrapped value type when the value type is anOptional. (#396)
Deprecations and Removals
-
The requirement
BindingSource.observe(_:during:)and the implementations have been removed. -
All Swift 2 (ReactiveCocoa 4) obsolete symbols have been removed.
-
All deprecated methods and protocols in ReactiveSwift 1.1.x are no longer available.
Acknowledgement
Thank you to all of @ReactiveCocoa/reactiveswift and all our contributors, but especially to @andersio, @calebd, @eimantas, @ikesyo, @inamiy, @Marcocanc, @mdiep, @NachoSoto, @sharplet and @tjnet. ReactiveSwift is only possible due to the many hours of work that these individuals have volunteered. ❤️