
上周,我们讨论了
SwiftUI中类似Redux的状态容器 。 Redux提供了真实值的单一来源,可防止在不同应用程序状态下可能发生的大量潜在错误。 本周,我们将讨论用于创建基于Redux的应用程序的行之有效的方法,这些方法将使我们的代码基础保持简单且无错误。
归一化
在Redux的概念中,有一个存储对象,其中包含整个应用程序的状态,并且它充当我们应用程序的真实值的单一来源。 这使我们能够将用户界面与应用程序状态同步。 但是,为了实现这一点,首先,必须规范状态。 考虑下面的代码示例。
struct AppState { var allTasks: [Task] var favorited: [Task] }
有一个
AppState结构,用于存储简单任务和选定任务的列表。 它看起来很简单,但是有一个大缺陷。 假设有一个任务编辑屏幕,您可以在其中更改所选任务。 每当用户单击“保存”按钮时,我们都需要在
allTasks (所有任务)列表以及
收藏 (选定)任务列表中查找并更新特定任务。 如果任务列表太大,可能会导致错误和性能问题。
让我们通过规范状态结构来稍微提高应用程序的性能。 首先,我们必须将任务存储在
Dictionary中 ,其中任务标识符是键,而任务本身是值。 字典可以获取固定时间的键值
(O(1)) ,但同时不保留顺序。 在这种情况下,您可以创建带有标识符的数组以保留顺序。 现在,让我们看一看标准化后的更改状态。
struct AppState { var tasks: [Int: Task] var allTasks: [Int] var favorited: [Int] }
如上例所示,任务存储在字典中,其中任务标识符
id是键,而任务本身是值。 存储所有任务和选定任务的标识符数组。 我们达到了稳定的状态,可以同步用户界面和数据。
组成状态
将应用程序的状态存储在单个结构中是很自然的事情,但是只要将越来越多的字段添加到状态结构中,它就会爆炸。 我们可以使用合成
状态来解决这个问题。 让我们来看一个例子。
struct AppState { var calendar: CalendarState var trends: TrendsState var settings: SettingState }
在上面的代码示例中,我们将状态分为三个独立的部分,并将它们组合成一个AppState。
成分还原剂
类似Redux的状态容器的另一个重要组件是
Reducer本身。 与状态结构一样,它可以提取和组合。 这将使我们能够遵守“单一责任”原则并维护诸如小尺寸减速器之类的物体。
enum AppAction { case calendar(action: CalendarAction) case trends(action: TrendsAction) } let trendsReducer: Reducer<TrendsState, TrendsAction> = Reducer { state, action in
结论
今天,我们讨论了在SwiftUI中使用类似Redux的状态容器开发应用程序时应使用的两个重要策略。 标准化和集成都使创建的应用程序更简单易懂。 希望您喜欢这篇文章。
感谢您的阅读,下周见!