Swift中的单向数据流架构(Redux)

我非常喜欢使用Swift的可重用和干净的架构。 在我的上一个项目中,我实现了MVVM和面向协议的体系结构,这有助于将关注点分开。 我也曾按照MVC方法从事过几个IOS项目。 在开始新项目或适应旧代码的同时选择正确的体系结构很重要。

我必须找到有关iOS体系结构模式的综述,如果您也感兴趣的话,可以介绍常见的体系结构。

iOS架构模式
揭秘MVC,MVP,MVVM和VIPER medium.com

但是有一种更好的方法(以我的拙见)主要是在我的经验中,MVVM在保持轻巧的同时做得很好,并且我确实在Swift中使用MVVM实现了单向数据流(Redux)方法,这产生了巨大的变化。 它使干净的体系结构稍微好一点,健壮且可测试 ,因此很重要

在本文中,我试图解释为什么将Redux与Swift结合使用是更好的主意。
首先,我们需要了解该概念的基础。

因此,让我们开始吧!

什么是Redux和单向数据流?

Redux是一种流量实现,但实现略好一些,它使您的应用程序状态更加可预测。 它首先以强大的javascript库React作为JavaScript应用程序的可预测状态容器出现在Javascript世界中。

Redux,仅使应用程序的状态位于单个存储对象中。 因此,从应用程序/视图的生命周期状态触发操作会发生变化,而针对该操作的化简器会生成新状态。

关于Redux的另一种解释,您可以阅读Redux的卡通指南介绍

Redux的卡通简介
导致比Flux更加混乱的一件事是Flux和Redux之间的区别,这种模式以前是… code-cartoons.com

让我们开始;

在本文中,我使用了benjaminencz的ReSwift,后者在Swift上创建了Redux实现。

ReSwift是Swift中单向数据流架构的类似Redux的实现。 ReSwift可帮助您将应用程序组件的三个重要方面分开:

重新浏览参考
ReSwift正在快速发展,超越了核心库,它提供了用于路由和时间旅行的实验性扩展… reswift.github.io

  • 状态:在ReSwift应用中,整个应用状态都明确存储在数据结构中。 这有助于避免复杂的状态管理代码,实现更好的调试,并具有许多其他好处……
  • 视图:在ReSwift应用程序中,当状态更改时,视图也会更新。 您的视图成为当前应用程序状态的简单可视化。
  • 状态更改:在ReSwift应用中,您只能通过操作执行状态更改。 动作是描述状态变化的小数据。 通过极大地限制状态改变的方式,您的应用程序变得更易于理解,并且可以与许多协作者一起工作。

从ReSwift网站剪辑

用法

在这个简单的示例中,我声明了一个BaseState,因为struct带有两个状态。
BaseReducer已注册其减速器。

LoadingState struct处理显示正在加载微调器视图或隐藏视图的状态 ,是否具有isLoading属性知道当前正在加载? 它是在视图中旋转或在状态中旋转的类型。

然后,声明的LoadingAction具有两个结构, LoadingShowAction将类型传递为有效负载,LoadingHideAction不包含任何有效负载。

最后,LoadingReducer采取操作( LoadingShowAction或LoadingHideAction )和当前状态,并生成一个新状态。

简单。

因此,此时我们可以调度一个动作,即;

store.dispatch(LoadingShowAction(type:.Normal))显示微调器
store.dispatch(LoadingHideAction())隐藏微调

Dispatcher的fires newState()方法采用LoadingState,因此我们的LoadingView(是实现微调器的简单UIView)setType和隐藏的属性更改被预订。

当分派方法触发时,它会分派动作,将reducer更改为状态,由订户(已订阅VC)通知的新状态,UI自动更新。

好处是;

  • 结构:您的所有操作,减速器彼此清晰地分开,使您成为孤立的组件。
  • 可预测性是免费提供的。 您将知道如何将当前状态与操作和应用程序的其他部分同步。
  • 可维护性 存储,状态,操作和简化器是简单的结构,易于维护和测试。
  • 组织代码。 任何新的团队成员都可以轻松了解事情的运作方式。 (.ie存储状态如何,分派给reducer的动作,reduce生成新状态,然后订阅VC触发的UI更改等。)

使用无方向数据流和MVVM对我来说做得很好,值得尝试。

如果您有想法和建议,请在下面留下评论。
到今天为止。

感谢您的阅读。

这篇文章中的资源

重新快速/重新快速
ReSwift – Swift中的单向数据流–受Redux启发 github.com 重新记录/重新记录
ReSwift-Recorder – ReSwift的时间旅行和热装 github.com 重新启动/重新启动路由器
ReSwift-Router – Swift中的声明式路由,ReSwift的扩展 github.com