Skip to main content

Unidirectional Data Flow Architecture (Redux) in Swift

In this post, I try to explain why using Redux with Swift is better idea [than MVVM].

What is Redux and Unidirectional Data Flow?

Redux is a flux implementation but slightly better implementation, it makes your application’s state more predictable. It first came out in Javascript world as a predictable state container for JavaScript apps with the powerful javascript library React.

Redux, simply makes your application’s state in single store object. So firing an action from your application/in view’s lifecycle state changes and your reducers for that action generate a new state.


Seyhun Akyürek at Medium

Replacing Redux in Swift with something better

Being a fantastic framework for development doesn’t come without a cost. Every time you update internal state in Redux, the entire interface re-renders. This isn’t a huge deal in most cases. But eventually you might have a situation where one update to state needs to be instantaneous (like using the keyboard shortcut to move from one message to the next), while another update is taking a while to compute (like processing hundreds or thousands of new message headers just downloaded from the email server). Since everything is managed in Redux’s development-friendly single unidirectional, single-threaded store, you get a frustrating lag.

Redux wasn’t designed with the opportunities native apps have, like multi-threading. And it wasn’t designed with the difficulties fully native apps have, like sharing some code among a separate mobile and desktop app, or having to do their heavy processing, database storage, etc., in-app, all while keeping the interface lightning fast.

Only when one chain lands at an interface component that is currently being used does it travel back up the tree and compute what it needs. But it only computes exactly what it needs, and this is all opaque to the code outside of the framework; it seems to work as though needed values have already been computed.

By declaring how each piece of state or interface reacts to other state changing, the framework is able to run each piece of your code only and exactly when it is needed.

Alex Obenauer at Medium.com
SwiftReactions Framework

Comments

Most Favorite Posts

How to link to TestFlight App in iOS

There are two things you need to do. First, check to see if TestFlight is installed. Then create a new link to your app. NSURL *customAppURL = [NSURL URLWithString:@"itms-beta://"]; if ([[UIApplication sharedApplication] canOpenURL:customAppURL]) {     // TestFlight is installed     // Special link that includes the app's Apple ID     customAppURL = [NSURL URLWithString:@"https://beta.itunes.apple.com/v1/app/978489855"];      [[UIApplication sharedApplication] openURL:customAppURL]; } This special https://beta.itunes.apple.com URL will be opened directly in TestFlight. Finally, if you are using iOS 9 (or later), you need to make an addition to your Info.plist to get the canOpenURL: method to work. If your app is linked on or after iOS 9.0, you must declare the URL schemes you want to pass to this method. Do this by using the LSApplicationQueriesSchemes array in your Xcode project’s Info.plist file. For each URL scheme you wan...

Working natively with JavaScript in iOS and Android without WebView

Using JavaScript code from native code without using a WebView (sic!) can be really useful to introduce dynamic functionality that was updatable without need of updating the app shorter iteration cycles share code between backend and native iOS and Android apps You can have business logic provided by a JavaScript that then controls the app that inject native functionality in the JavaScript context. You could even write an A/B testing framework based on this approach. iOS iOS offers the native JavaScriptCore: Evaluate JavaScript programs from within an app, and support JavaScript scripting of your app. So you can evaluate a script and read its return value natively: context.evaluateScript(myLib); let result = context.evaluateScript("myFunction();") let myFunction = context.objectForKeyedSubscription("myFunction"); let parametrizedResult = myFunction.invokeMethod(...) Or you can inject a native object into the JavaScript engine: @objc protoco...

Xcode 7.2: Refactoring not supported for Swift... but there is a plugin!

but... there is a plugin for that: Refactorator GitHub

Bundeskartellamt prüft Apples Tracking-Regelungen für Dritt-Apps (ATT, App Tracking Transparency Framework)

Das Bundeskartellamt hat gegen das Technologieunternehmen Apple ein Verfahren zur kartellrechtlichen Prüfung seiner Tracking-Regelungen sowie des App Tracking Transparency Framework eingeleitet. Das Bundeskartellamt geht dabei insbesondere dem Anfangsverdacht nach, dass diese Regelungen Apples eigene Angebote bevorzugt behandeln und/oder andere Unternehmen behindern könnten. 14.06.2022 Pressemeldung Bundeskartellamt

Validity Time Auto-Renewables in Sandbox

The subscription durations, sandbox durations and incentive durations of auto-renewables. Hint: In Sandbox the validity time differs from live environment!!! Durations Sandbox Duration Incentive Durations (optional) 7 days 3 minutes 7 days 1 month 5 minutes 7 days, 1 month 2 months 10 minutes 7 days, 1 month 3 months 15 minutes 1 month 6 months 30 minutes 1 month, 2 months 1 year 1 hour 1 month, 2 months, 3 months After 6 extensions the abo is cancelled automatically in the sandbox environment.

NSURLProtocol

NSURLProtocol is both the most obscure and the most powerful part of the URL Loading System. It's an abstract class that allows subclasses to define the URL loading behavior of new or existing schemes. Intercepting HTTP requests to serve images locally from the app bundle resources, if available Signing outgoing streaming media requests Creating a proxy server for a local data transformation service with a URL request interface Introducing custom schemes (e.g. myapplocalfile://myfile.gif) and intercept them Even the UIWebView class makes request using the default iOS URL Loading System, so you might use custom scheme inside HTML, creating an NSURLProtocol and deliver the response from a local file. NSHipster NSURLProtocol

Employee Development ...by Cards ...by Lego Brick Boards

Employee Development by using Skill Cards The goal is to build a hand of cards that make up that person’s most relevant personal growth areas. To do this, both the people leader and team member start with a deck of the same skill cards each. In private, each goes through this deck and sorts these cards into three stacks: not relevant, good enough, and to improve. By discussing why each card was placed where, with particular focus on those that do not match, a real, structured, and to-the-point conversation occurs. By focusing on reasoning—what led you to place this card here?—both can develop a shared understanding of the other's views. The main event, however, comes in focusing on those cards in “to improve”. To create focus and drive actual impact, these cards are discussed and prioritized. With a clear priority and a shared understanding of the individual aspects of each, tangible actions are crafted that can be taken to grow one’s career. LinkedIn Rob Sawyer mobi...