ClassyFlux

License Language Build Status Coverage Status

简洁而功能齐全的 Flux 模式 Swift 实现

简要文档

您可以在此处阅读更多关于 Flux 模式的信息

FluxAction

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

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 是一个容器,用于管理底层状态,广播关于状态更改的通知。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

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 文件。