简洁而功能齐全的 Flux 模式 Swift 实现
您可以在此处阅读更多关于 Flux 模式的信息
FluxAction 通常是一个普通对象,携带描述特定用户操作或系统事件上下文的信息。Action 通过 FluxDispatcher 实现分发,并广播给在 dispatcher 中注册的所有 worker。FluxStore 可以响应 action 修改其状态。FluxMiddleware 可以启动异步工作,并通过广播其他 action 来报告结果。
声明示例
enum Action {
struct UpdateName: FluxAction {
let name: String
}
}
在主线程上使用默认 dispatcher 发送 action 的示例
Action.UpdateName(name: "Great Name").dispatch()
FluxDispatcher 将 action 分发给 worker 的集合,这些 worker 可以是 store、middleware 甚至其他 dispatcher。Action 从一个 worker 分发到另一个 worker,并且可以被 worker 修改和/或替换。请注意 worker 的顺序,它非常重要,如果配置不正确可能会导致行为异常。
使用示例
let dispatcher = FluxDispatcher()
dispatcher.register(workers: [SomeStore(), SomeMiddleware(dispatcher: dispatcher), AnalyticsLogger()])
SomeAction(value: Value()).dispatch(with: dispatcher)
FluxStore 是一个容器,用于管理底层状态,广播关于状态更改的通知。FluxStore 是 ObservableObject,可以直接在 SwiftUI 视图中使用以渲染状态。状态可以通过向 dispatcher 发送相关 action 来修改,FluxStore 实例已在 dispatcher 中注册。FluxStore 在主队列上同步状态更改。
声明示例
class SomeStore: FluxStore<SomeState> {
init() {
super.init(initialState: SomeState())
registerReducer(for: SomeAction.self) { (state, action) in
state.value = action.value
return [\SomeState.value] // Reports which part of the state did change
}
}
}
FluxMiddleware 旨在用于运行异步工作,并通过向 dispatcher 发送适当的 action 来更新其他组件。
声明示例
class SomeMiddleware: FluxMiddleware {
private weak var dispatcher: FluxDispatcher?
init(dispatcher: FluxDispatcher) {
self.dispatcher = dispatcher
super.init()
registerHandler(for: SomeAction.self) { [unowned self] (action) in
self.performWork(value: action.value) // Start async work
// Handler passes the same action to subsequent workers by default
}
registerComposer(for: OtherAction.self) { (action) in
return .next(ThirdAction()) // Pass another action to subsequent workers
}
registerComposer(for: IgnoredAction.self) { (action) in
return .stop() // Do not pass the action to subsequent workers
}
}
private func performWork(value: Value) {
RemoteAPI.sendRequest(value: value) { [weak self] in
SomeOtherAction(outcome: $0).dispatch(with: self?.dispatcher)
}
}
}
Natan Zalkin natan.zalkin@me.com
ClassyFlux 在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。