ClassyFlux 2.0.1

ClassyFlux 2.0.1

Natan Zalkin 维护。



  • Natan Zalkin

ClassyFlux

License Language Build Status Coverage Status

简单但功能齐全的 Swift 实施 Flux 模式

简要说明

您可以在此处了解更多关于 Flux 模式的信息:这里

FluxAction

FluxAction 通常是一个简单的对象,携带描述特定用户操作或系统事件上下文的信息。通过 FluxDispatcher 实现分发的操作广播到所有在调度器中注册的工作者。FluxStore 可以在响应操作时修改其状态。FluxMiddleware 可以开始异步工作并通过广播另一个操作进行汇报。

示例声明

enum Action {
    struct UpdateName: FluxAction {
        let name: String
    }
}

在主线程上使用默认调度器发送操作示例

Action.UpdateName(name: "Great Name").dispatch()

FluxDispatcher

FluxDispatcher 将操作分发给混合工作者,这些工作者可以是存储、中间件甚至是其他调度器。操作可以从一个工作者分发给另一个工作者,并可以被工作者修改和/或替换。注意工作者的顺序,它很重要,如果配置不正确,可能会导致行为异常。

使用示例

let dispatcher = FluxDispatcher() 

dispatcher.register(workers: [SomeStore(), SomeMiddleware(dispatcher: dispatcher), AnalyticsLogger()])

SomeAction(value: Value()).dispatch(with: dispatcher)

FluxStore

FluxStore是一个管理底层状态、广播状态变更通知的容器。FluxStore是ObservableObject,可以直接在SwiftUI视图中使用来渲染状态。可以通过向派发器发送相关动作来修改状态。

示例声明

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用于运行异步任务并通过向派发器发送适当的动作来更新其他组件。

示例声明

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 [email protected]

许可证

ClassyFlux遵循MIT许可证。更多信息请参阅LICENSE文件。