Swidux
受 Redux 启发的 Swift 单向数据流。
使用方法
定义您的应用程序状态,
struct AppState {
var count = 0
}
可能执行的动作列表,
enum CounterAction: Action {
case increment
case decrement
}
以及它们如何影响应用程序状态。
let counterReducer = Reducer<Int> { state, action in
switch action {
case CounterAction.increment: state += 1
case CounterAction.decrement: state -= 1
default: break
}
}
然后初始化应用程序存储,
let store = Store<AppState>(
initialState: AppState(),
reducer: counterReducer.lift(\.count)
)
订阅任何应用程序状态键路径以接收状态更改通知(确保保留引用,因为其释放将停止订阅)。
let token = store.subscribe(\.count) { print($0) }
现在 dispatch
动作以修改应用程序状态,并使用您的状态更改订阅来更新您的 UI,...
store.dispatch(CounterAction.increment)
store.dispatch(CounterAction.decrement)
讨论
AppState
应用程序状态必须是值类型,因为 Swidux 存储依赖于 didSet
监听器来通知订阅者状态更改。
减速器
还原器使用 (inout State, Action) -> Void
签名(而不是 (State, Action) -> State
),以提高性能并避免大量 State
的复制。
中间件
中间件允许扩展 swidux 架构。它们可以在还原器之前和之后执行操作,可以用来处理各种问题,如日志记录、处理异步操作等...
内部,每个中间件都会接收到一个 dispatch 函数作为参数(以及用于获取状态的存储),并返回一个包装后的函数,该函数将被下一个中间件和最终被 swidux 存储使用。
因此,您应该注意中间件的顺序。例如,一个中间件可能决定不向 dispatch 函数传播某些操作(可能是这些操作仅用于其操作)。如果您的中间件中包含日志记录器,则根据中间件的顺序,这些操作将被记录或不会记录。
安装
Carthage
在您的 Cartfile
中添加以下依赖项
github "clmntcrl/swidux" ~> 1.0
CocoaPods
在您的 Podfile
中添加以下插件
pod 'Swidux', '~> 1.0'
SwiftPM
在您的 Package.swift
中将包作为依赖项添加
dependencies: [
.package(url: "https://github.com/clmntcrl/swidux.git", from: "1.0"),
]
许可协议
Swidux 在 MIT 许可协议下发布。详细信息请见 LICENSE。