Redux就像SwiftUI中的状态容器。 推荐建议

图片

上周,我们讨论了SwiftUI中类似Redux的状态容器 。 Redux提供了真实值的单一来源,可防止在不同应用程序状态下可能发生的大量潜在错误。 本周,我们将讨论用于创建基于Redux的应用程序的行之有效的方法,这些方法将使我们的代码基础保持简单且无错误。

归一化


在Redux的概念中,有一个存储对象,其中包含整个应用程序的状态,并且它充当我们应用程序的真实值的单一来源。 这使我们能够将用户界面与应用程序状态同步。 但是,为了实现这一点,首先,必须规范状态。 考虑下面的代码示例。

struct AppState { var allTasks: [Task] var favorited: [Task] } 

有一个AppState结构,用于存储简单任务和选定任务的列表。 它看起来很简单,但是有一个大缺陷。 假设有一个任务编辑屏幕,您可以在其中更改所选任务。 每当用户单击“保存”按钮时,我们都需要在allTask​​s (所有任务)列表以及收藏 (选定)任务列表中查找并更新特定任务。 如果任务列表太大,可能会导致错误和性能问题。

让我们通过规范状态结构来稍微提高应用程序的性能。 首先,我们必须将任务存储在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 // Implement your state changes here } let calendarReducer: Reducer<CalendarState, CalendarAction> = Reducer { state, action in // Implement your state changes here } let appReducer: Reducer<AppState, AppAction> = Reducer { state, action in switch action { case let .calendar(action): calendarReducer.reduce(&state.calendar, action) case let .trends(action): trendsReducer.reduce(&state.trends, action) } } 

结论


今天,我们讨论了在SwiftUI中使用类似Redux的状态容器开发应用程序时应使用的两个重要策略。 标准化和集成都使创建的应用程序更简单易懂。 希望您喜欢这篇文章。

感谢您的阅读,下周见!

Source: https://habr.com/ru/post/zh-CN476924/


All Articles