Releases: ReactiveCocoa/reactiveswift-composable-architecture
0.42.0
0.41.2
0.40.2
0.39.1
Brings the fork up to date with the upstream TCA release 0.39.1
Please refer to the TCA release notes for 0.39.1 and 0.39.0.
This brings the fork up to date with all the commits from TCA after the Concurrency Beta was merged, then up to version 0.39.1.
Migration notes
Please refer to PR #58 for more details, but the main points can be found below.
⚠️ Breaking changes due to Effect
no longer typealiasing SignalProducer
⚠️
This update will cause countless breaking changes in projects as Effect
is now a struct
that wraps a SignalProducer
instead of being a typealias
of it. This is not as big of a problem in upstream TCA because Effect
is still a Publisher
, so all Combine operators will keep working on Effect
operation chains, whereas in RAS-TCA they will now break.
We felt that despite being a harder migration path, users will be (forcibly 😅) steered away from SP-based effects in favor of the new async
based ones quicker. Deprecation warnings providing fix-its were difficult to add, so please bear with the compiler screaming a bit at you 🙏🏼
ReactiveSwift 7.1 dependency
This release now points to ReactiveSwift 7.1, which already includes async
APIs in TestScheduler
and DateScheduler
.
New SignalProducerConvertible.values
Async(Throwing)Stream
APIs
In order to use SignalProducer
s in the async
"world", while replicating the existing APIs in Combine
, two new
values
computed properties in SignalProducerConvertible
were added:
values: AsyncStream<Value>
whenError == Never
values: AsyncThrowingStream<Value, Swift.Error>
otherwise
0.38.3
Brings the fork up to date with the upstream TCA release 0.38.3
Please refer to the TCA release notes for 0.38.2 and 0.38.3.
This brings the fork up to date with all the commits from TCA before the Concurrency Beta was merged.
The Swift Concurrency changes in TCA are a very significant re-architecture of TCA which make porting these changes to the Reactive Swift fork challenging, to say the least. This is likely to be the last release of this repo for some time.
0.38.1
Brings the fork up to date with the latest upstream TCA release 0.38.1
By implementing a ReactiveSwift version of the CurrentValueRelay
in TCA the ViewStore
implementation is now much closer to the upstream one.
From upstream TCA
Please refer to the TCA release notes for changes since 0.33.1.
0.33.1
Breaking changes
This release increases the minimum supported Apple OSes to be the same as Combine TCA:
- iOS 13
- macOS 10.15
- tvOS 13
- watchOS 6
Support for Linux is unchanged.
See this blog post for more details on the reasons.
If you want to continue to use RAS TCA with older OS versions, please use release 0.28.1, which is the last release that supports them.
From upstream TCA
Please refer to the Combine TCA release notes for changes since 0.28.1.
0.28.1
From upstream TCA
This release brings this fork up to date with the upstream library at release 0.28.1. Please refer to the upstream release notes.
An extra commit from upstream was also added: Add actionless CaseLet overload
From TCA 0.28.0
Please refer to the TCA 0.28.0 release notes.
From TCA 0.27.1
Please refer to the TCA 0.27.1 release notes.
0.27.0
RAS-TCA specific changes
Changed: now requires ReactiveSwift 6.7.0 which supports re-entrant signals. This change, which is only used in Store.send
means that RAS-TCA now works exactly like the original Combine version and allows recursive calls to .send
, which previously would cause a crash on obtaining a Signal lock.
This now means that in the cases where previously you needed to wrap a call to .send
in a DispatchQueue.main.async {}
wrapper, this is no longer required.
It also means that all performance improvements from TCA have now been able to be ported across 🚀 However this does can cause a potential breaking change as mentioned in the release notes for TCA 0.20.0:
Performance improvement/fix: a store publisher will only emit a single state change per synchronous Store.send and asynchronous effect received. This means synchronous effects (returned immediately from a reducer via Effect.init(value:)) will no longer result in extra publisher emissions. This is a breaking change if your application previously depended on each of these emissions. Workaround: use Publisher.receive(on:) to schedule these effects on the next run loop tick.
The workaround for RAS-TCA is to use .observe(on: QueueScheduler.main)
for these situations.
From upstream TCA
This release brings this fork up to date with the upstream library at release 0.27.0:
From TCA 0.23.0
Please refer to the TCA 0.23.0 release notes.
From TCA 0.24.0
Please refer to the TCA 0.24.0 release notes.
From TCA 0.25.0
Please refer to the TCA 0.25.0 release notes.
Note:
Added: the Composable Architecture now uses Custom Dump for its debugging and testing tools. This library improves upon the original debugging/diffing tools that came with earlier versions of the Composable Architecture by collapsing unchanged parts of the diff, and more.
Since Custom Dump requires iOS 13, macOS 10.15 etc, this fork continues with the existing debugDump
code in the library and doesn't use Custom Dump. This also means XCTAssertNoDifference
is not available in this fork.
From TCA 0.26.0
Please refer to the TCA 0.26.0 release notes.
From TCA 0.27.0
Please refer to the TCA 0.27.0 release notes.
0.22.0
This release brings this fork up to date with the upstream library (finally). It was a tricky one. It was possible to bring over most, but not all, of the performance improvements from the upstream TCA. The ReactiveSwift limitation of not allowing reentrant Signals (which I hope will soon be fixed) is the main reason that not all the performance improvements were able to be migrated.
Note: there is a minor breaking change in this release which is that the parameter names for Effect.throttle
(now public) and Effect.debounce
have been changed to match their equivalents in the upstream repo.
From TCA 0.19.0:
- Added: a new overload of
Reducer.pullback
for working with enum-based state. It uses a case path instead of a writable key path for extracting and embedding state for a particular enum case. - Added: a new
SwitchStore
view for converting stores on enum state into stores on individual enum cases (thanks @lukeredpath for sketching out the original implementation). - Changed:
Effect.timer
now callscancelInFlight: true
under the hood to automatically cancel any in-flight timers with the same cancellable id (thanks @dannyhertz). If you rely on the existing behavior, which allows for timers to interleave and stack on one another, you must manually create these timers usingSignalProducer.timer
instead before upgrading. - Fixed:
ForEachStore
has been optimized and a crash related to removing rows has been fixed. - Fixed: documentation cleanup.
- Infrastructure: modernized example/demo code, along with assorted fixes (thanks @yimajo, @filblue).
From TCA: 0.20.0
- Added:
Effect.deferred()
, for delaying the execution of an effect by a given time (compare to SignalProducer.delay(), which delays merely the delivery of some work that has already been performed). Thanks, @wendyliga. - Updated:
SwitchStore
now supports up to 9CaseLet
views. - Performance improvement/fix: the number of times
Store.scope
's state transform function has been minimized. Previously it was evaluated an extra time, multiplied by downstream scopes. - Performance improvement/fix: the number of times ViewStore's duplicate check has been reduced.
- This change was impossible to implement due to the way ReactiveSwift is implemented internally:
Performance improvement/fix: a store publisher will only emit a single state change per synchronous Store.send and asynchronous effect received. This means synchronous effects (returned immediately from a reducer via Effect.init(value:)) will no longer result in extra publisher emissions. If your application previously depended on each of these emissions, use Publisher.receive(on:) to schedule these effects on the next run loop tick. - Infrastructure: cleaned up demo apps and documentation; added an Indonesian translation of the README (thanks @wendyliga).
From TCA: 0.21.0
- As Identified Collections cannot support iOS <13 this library continues to depend on the internal
IdentifiedArray
, and will do for the foreseeable future.Changed: the Composable Architecture now depends on Identified Collections for IdentifiedArray, which has been rewritten for correctness and performance. There are some breaking changes, which are documented in its release. - Changed:
Reducer.binding
now takes an extract function, not a case path. Case path expressions can still be used, or you can refer tocasePath.extract(from:)
. - Changed:
TestStore
has relaxed itsEquatable
constraint on Action. It is only required for whenTestStore.receives
actions from effects. - Performance fixed: view stores now perform the minimum number of equality checks necessary (thanks @iampatbrown).
- Fixed: ViewStore.publisher now emits the current store state, and not the previous state (thanks @maximkrouk, @iampatbrown).
- Infrastructure: cleaned up recursive case study, web socket case study; added benchmarking target.
From TCA: 0.22.0
- Added:
Effect.throttle
can throttle how often its associated action is fed back into the reducer (thanks @kerryknight). - This change was not applied, as it forces explicit disposing of any producer of state obtained from a
ViewStore
, which would be counterintuitive for ReactiveSwift users. Be aware that if aViewStore
is deinitialized, it's producer will no longer emit actions.Fixed: A change in 0.21.0 that prevented store publishers from emitting actions if their view stores were deinitialized. This mainly affected UIKit apps. - Fixed: A change in 0.20.0 that could leave an action buffered in the store and emit late (thanks @heyltsjay).