前端MVVM架构的流行,现在大部分客户端开发语言都提供了这种框架,那关于VM的实现也是有很多种方式,比如Vue的基于Proxy代理的发布订阅模式,还有Redux这种函数式的状态管理工具;我本人最主要使用的技术栈是React+Redux+Saga,用Redux负责状态管理,Saga负责Action的副作用的设计模式,它具有非常清晰的逻辑结构,代码很容易阅读、维护、拓展;而SwiftUI里面的VM和提供的全局状态共享的方法,实现方式与Vue很相似,都是对目标对象get、set进行监听,我们想得到一个类似于Redux+Saga的可预测可测试的全局状态管理方法并不容易;并且Github上有关swift redux的开源库也只有一两个,很多年不更新并且没什么对应的中间件提供,所以我决定开发这样一个Redux状态管理工具,并且提供常用的插件,比如:缓存控制、Saga副作用管理、状态记录。
在SwiftRedux里我主要提供了Store类,我们可以传三个参数(initialState, reducer, enhancer)
来构造Store对象,initialState是初始化的State,reducer是action的处理函数,enhancer是可选的插件;我们的Store对象最主要对外提供两个方法<store.getState(), store.dispatch()>
,我们可以通过SwiftUI自带的@EnvironmentObject来对Store.state进行订阅,在Store里,我将@Published state 对象设置为私有,同时对外暴露一个计算属性state,供组件进行访问,这样dispatch就成了更新State的唯一途径。
关于缓存控制,我参考了redux-persist提供了persistReducer方法,它采用了高阶函数的思想,用户可以将State实现对应的Persistent协议,指定哪些具体的属性需要缓存,persistReducer会自动同步缓存数据,并在打开App的时候自动将缓存数据写入state中。
关于状态记录中间件,用户可以指定输出的平台,从而将每次dispatch的Action,以及之前之后的State记录下来,方便调试以及action记录。
关于Saga Middleware,由于时间原因,目前才做了一部分,还没有能够全部完成,Saga的实现和流程的控制还是很复杂的,这个我有时间会继续完成这一部分的。
对于Redux的流程控制,我在发布的Swift Package里也实现了对应的测试,方便维护与拓展。
我做了一个2048的小游戏,这个游戏便是用我自己做的Swift Redux来进行状态管理的,整个游戏的状态逻辑控制以及交互动画都是自己动手实现的,并且我通过Redux里的persistReducer很方便的自动缓存了游戏的数据,使得每次打开时能够自动恢复上一次的状态,以及最高分等的本地记录。关于这个游戏的状态逻辑控制和交互动画控制我都有写notion,所有结构都非常清晰。
最后我想强调一下,我对