Changelog History
Page 4
-
v2.0.0-alpha.1 Changes
π This 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 newSignal
internal which does not exploit deliberate retain cycles that consequentially confuse memory debugging tools.π¦ A
Signal
is now automatically and silently disposed of, when:π¦ 1. the
Signal
is not retained and has no active observer; or- (New) both the
Signal
and 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 usesLifetime
for resource management. You may observe theLifetime
for the disposal of the producedSignal
.let producer = SignalProducer<Int, NoError> { observer, lifetime in if let disposable = numbers.observe(observer) { lifetime.observeEnded(disposable.dispose) } }
π Two
Disposable
-accepting methodsLifetime.Type.+=
andLifetime.add
are provided to aid migration, and are subject to removal in a future release.π¦ Signal and SignalProducer
π¦ 1. All
Signal
andSignalProducer
operators now belongs to the respective concrete types. (#304)Custom operators should extend the concrete types directly.
SignalProtocol
andSignalProducerProtocol
should be used only for constraining associated types.β 1.
combineLatest
andzip
are 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)
π¦ 1.
Event
is renamed toSignal.Event
. (#376)π¦ 1.
Observer
is 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
BindingSource
now requires only a producer representation ofself
. (#359)The
<~
operator overloads are now provided byBindingTargetProvider
. (#359)
Disposables
SimpleDisposable
andActionDisposable
has been folded intoAnyDisposable
. (#412)CompositeDisposable.DisposableHandle
is replaced byDisposable?
. (#363)The
+=
operator overloads forCompositeDisposable
are now hosted inside the concrete types. (#412)
Bag
π 1. Improved the performance of
Bag
. (#354)RemovalToken
is renamed toBag.Token
. (#354)
β± Schedulers
β± 1.
Scheduler
gains a class bound. (#333)Lifetime
Lifetime.ended
now uses the inhabitableNever
as its value type. (#392)
Atomic
Signal
andAtomic
now useos_unfair_lock
when it is available. (#342)
β Additions
FlattenStrategy.race
is introduced. (#233, kudos to @inamiy)
race
flattens whichever inner signal that first sends an event, and ignores the rest.FlattenStrategy.concurrent
is introduced. (#298, kudos to @andersio)
concurrent
starts 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
inout
reference to the accumulator, which helps the performance when a large value type is used, e.g. collection.π¦ 1.
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
π 1. The requirement
BindingSource.observe(_:during:)
and the implementations have been removed.π 1. All Swift 2 (ReactiveCocoa 4) obsolete symbols have been removed.
π 1. 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. β€οΈ
- (New) both the
-
v1.1.3 Changes
π Deprecation
π 1.
observe(_:during:)
is now deprecated. It would be removed in ReactiveSwift 2.0. Usetake(during:)
and the relevant observation API ofSignal
,SignalProducer
andProperty
instead. (#374) -
v1.1.2 Changes
π Changes
π 1. Fixed a rare occurrence of
interrupted
events being emitted by aProperty
. (#362) -
v1.1.1 Changes
π Changes
π¦ 1. The properties
Signal.negated
,SignalProducer.negated
andProperty.negated
are deprecated. Use its operator formnegate()
instead. -
v1.1 Changes
β Additions
General
π¦ 1. New boolean operators:
and
,or
andnegated
; available onSignal<Bool, E>
,SignalProducer<Bool, E>
andProperty<Bool, E>
types. (#160, kudos to @cristianames92)- New operator
filterMap
. (#232, kudos to @RuiAAPeres) β± 3. New operatorlazyMap(on:_:)
. It coalescesvalue
events when they are emitted at a rate faster than the rate the given scheduler can handle. The transform is applied on only the coalesced and the uncontended values. (#240, kudos to @liscio) - New protocol
BindingTargetProvider
, which replacesBindingTargetProtocol
. (#254, kudos to @andersio)
π¦ SignalProducer
π¦ 5. New initializer
SignalProducer(_:)
, which takes a@escaping () -> Value
closure. It is similar toSignalProducer(value:)
, but it lazily evaluates the value every time the producer is started. (#240, kudos to @liscio)Lifetime
- New method
Lifetime.observeEnded(self:)
. This is now the recommended way to explicitly observe the end of aLifetime
. UseLifetime.ended
only if composition is needed. (#229, kudos to @andersio) - New factory method
Lifetime.make()
, which returns a tuple ofLifetime
andLifetime.Token
. (#236, kudos to @sharplet)
Properties
ValidatingProperty
: A mutable property that validates mutations before committing them. (#182, kudos to @andersio). π» 9. A new interactive UI playground:ReactiveSwift-UIExamples.playground
. It demonstrates howValidatingProperty
can be used in an interactive form UI. (#182)
π Changes
π¦ 1. Flattening a signal of
Sequence
no longer requires an explicitFlattenStrategy
. (#199, kudos to @dmcrodrigues)BindingSourceProtocol
has been renamed toBindingSource
. (#254) β± 3.SchedulerProtocol
andDateSchedulerProtocol
has been renamed toScheduler
andDateScheduler
, respectively. (#257)take(during:)
now handles endedLifetime
properly. (#229)
π Deprecations
π 1.
AtomicProtocol
has been deprecated. (#279) π 2.ActionProtocol
has been deprecated. (#284) π 3.ObserverProtocol
has been deprecated. (#262) π 4.BindingTargetProtocol
has been deprecated. (#254) - New operator
-
v1.0.1 Changes
π Changes
π 1. Fixed a couple of infinite feedback loops in
Action
. (#221) π 2. Fixed a race condition ofSignal
which might result in a deadlock when a signal is sent a terminal event as a result of an observer of it being released. (#267)Kudos to @mdiep, @sharplet and @andersio who helped review the pull requests.
-
v1.0 Changes
π This is the first major release of ReactiveSwift, a multi-platform, pure-Swift functional reactive programming library spun off from ReactiveCocoa. As Swift continues to expand beyond Appleβs platforms, we hope that ReactiveSwift will see broader adoption. To learn more, please refer to ReactiveCocoaβs CHANGELOG.
Major changes since ReactiveCocoa 4 include:
- β‘οΈ Updated for Swift 3
APIs have been updated and renamed to adhere to the Swift 3 API Design Guidelines.
- π¦ Signal Lifetime Semantics
Signal
s now live and continue to emit events only while either (a) they have observers or (b) they are retained. This clears up a number of unexpected cases and makes Signals much less dangerous.- Reactive Proxies
Types can now declare conformance to
ReactiveExtensionsProvider
to expose areactive
property thatβs generic overself
. This property hosts reactive extensions to the type, such as the ones provided onNotificationCenter
andURLSession
.- Property Composition
Property
s can now be composed. They expose many of the familiar operators fromSignal
andSignalProducer
, includingmap
,flatMap
,combineLatest
, etc.- Binding Primitives
BindingTargetProtocol
andBindingSourceProtocol
have been introduced to allow binding of observable instances to targets.BindingTarget
is a new concrete type that can be used to wrap a settable but non-observable property.- Lifetime
Lifetime
is introduced to represent the lifetime of any arbitrary reference type. This can be used with the newtake(during:)
operator, but also forms part of the new binding APIs.- π Race-free Action
A new
Action
initializerAction(state:enabledIf:_:)
has been introduced. It allows the latest value of any arbitrary property to be supplied to the execution closure in addition to the input fromapply(_:)
, while having the availability being derived from the property.This eliminates a data race in ReactiveCocoa 4.x, when both the
enabledIf
predicate and the execution closure depend on an overlapping set of properties.Extensive use of Swiftβs
@available
declaration has been used to ease migration from ReactiveCocoa 4. Xcode should have fix-its for almost all changes from older APIs.Thank you to all of @ReactiveCocoa/ReactiveSwift and all our contributors, but especially to @andersio, @liscio, @mdiep, @nachosoto, and @sharplet. ReactiveSwift is only possible due to the many hours of work that these individuals have volunteered. β€οΈ