测试已测试 | ✗ |
Lang语言 | SwiftSwift |
许可证 | MIT |
发布最新发布 | 2017 年 6 月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 Nazih Shoura 维护。
依赖 | |
RxSwift | ~> 3.5.0 |
RxCocoa | ~> 3.5.0 |
RxState 是 Swift 应用的可预测状态容器。它是构建在 RxSwift 之上的小型库,受 Redux 启发,便于构建 单向数据流 架构。
应用程序状态:一个单一的不可变数据结构。它包括 UI 状态、导航状态和模型层的状态。
存储:包含应用程序状态,并通知某些应用程序状态的 观察者
状态的更新。
减少器:一个 纯函数,它接受当前应用程序状态和一个 操作
作为输入,创建一个反映由 操作
描述的变更的新 应用程序状态
,并返回新生成的 应用程序状态
。
操作:操作描述状态变化。修改 应用程序状态
的唯一方式是将 操作
分发到 存储
。
操作创建者和派发器:创建 操作
并将其分派到存储。
应用程序状态观察者:观察存储中的 应用程序状态
并将其转换为目标数据,记录日志等。
视图:呈现从 应用程序状态
衍生出的可表示数据,并将用户的交互传递给 操作创建者和派发器
。
视图/视图控制器
向 视图模型
发送事件(视图模型
的输入)。
视图模型(ViewModel)从收到的输入中创建 动作(Action)
并将其分发给 存储(Store)
。
动作创建器(Action Creator)
来创建 动作(Action)
。动作创建器可以异步工作,并根据得到的结果,返回不同的 动作(Action)
供视图模型分发。存储(Store)
将 应用状态(App State)
和收到的 动作(Action)
发送到 Reducer
。
Reducer
接收到当前的 应用状态(App State)
和发送的动作,计算并返回 新的 应用状态(App State)
。
存储(Store)
将 新的 应用状态(App State)
发送到订阅者。
中间件(Middleware)
,它会记录通过分发动作而产生的 应用状态(App State)
。应用状态(App State)
,将其转换为可展示的数据,并将其发送到 视图/视图控制器(View/View Controller)
。转换器(Transformer)
将 应用状态(App State)
转换为可展示的数据。这有助于您在不同的视图模型中重用转换代码。视图/视图控制器(View/View Controller)
会将用户界面渲染出来,向用户展示可展示的数据。RxState 为您定义了主要组件:
存储(Store)
:以 Driver<[SubstateType]>
的形式包含 应用状态(App State)
。
SubstateType
:一个协议,用于标记表示子状态的 struct。例如:
struct TasksState: SubstateType {
var tasks: [Task]
var addingTask: Bool
}
您可以通过分发 StoreAction.add(states: [SubstateType])
将 子状态(Substate)
添加到 应用状态(App State)
中。
let tasksState = TasksState()
let action = StoreAction.add(states: [tasksState])
store.dispatch(action: action)
动作类型(ActionType)
:一个协议,用于标记一个 动作(Action)
。存储具有以下 动作(Action)
:public enum StoreAction: ActionType {
/// Adds substates to the application state.
case add(states: [SubstateType])
/// Removes all substates in the application state.
case reset
}
主Reducer(MainReducer)
:存储的分发函数用于根据动作类型调用相应 reducer。let mainReducer: MainReducer = { (state: [SubstateType], action: ActionType) -> [SubstateType] in
// Copy the `App State`
var state: [SubstateType] = state
// Cast to a specific `Action`.
switch action {
case let action as TasksAction:
// Extract the `Substate`.
guard var (tasksStateIndex, tasksState) = state
.enumerated()
.first(where: { (_, substate: SubstateType) -> Bool in
return substate is Store.TasksState}
) as? (Int, Store.TasksState)
else {
fatalError("You need to register `TasksState` first")
}
// Reduce the `Substate` to get a new `Substate`.
tasksState = Store.reduce(state: tasksState, action: action)
// Replace the `Substate` in the `App State` with the new `Substate`.
state[tasksStateIndex] = tasksState as SubstateType
default:
fatalError("Unknown action type")
}
// Return the new `App State`
return state
}
中间件类型(MiddlewareType)
:一个定义可以观察 应用状态(App State)
和最后一个发送的动作并对它执行一些操作的对象的协议,例如记录。protocol LoggingMiddlewareType: Middleware, HasDisposeBag {}
final class LoggingMiddleware: LoggingMiddlewareType {
var disposeBag = DisposeBag()
func observe(currentStateLastAction: Driver<CurrentStateLastAction>) {
currentStateLastAction
.drive(
onNext: { (currentState: [SubstateType], lastAction: ActionType?) in
print(currentState)
print(lastAction)
}, onCompleted: nil, onDisposed: nil)
.disposed(by: disposeBag)
}
}
}
pod 'RxState'
我已经尝试使 示例应用 尽可能全面。它目前在 iOS 和 macOS 上运行。注意,由于架构,只需要更改 View/View Controller 层才能将应用从 iOS 移植到 macOS。
我们很高兴看到您的参与,非常欢迎反馈和贡献 - 检查 贡献指南。
Nazih Shoura,[email protected]
此库属于 RxSwiftCommunity。
RxState 按照MIT许可证提供。有关更多信息,请参阅 LICENSE 文件。