RxState 0.5.0

RxState 0.5.0

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布最新发布2017 年 6 月
SwiftSwift 版本3.0
SPM支持 SPM

Nazih Shoura 维护。



 
依赖
RxSwift~> 3.5.0
RxCocoa~> 3.5.0
 

RxState 0.5.0

  • Nazih Shoura

RxState RxState: Redux + RxSwift

RxState 是 Swift 应用的可预测状态容器。它是构建在 RxSwift 之上的小型库,受 Redux 启发,便于构建 单向数据流 架构。

为什么使用单向数据流架构?

  1. 帮助您以一致和统一的方式管理状态,保证它是可预测的(毕竟,状态是万恶之源,您 muốn 维持这种邪恶处于控制之中)。
  2. 限制了应用程序状态可以发生变更的方式,这使得您的应用程序更容易理解。
  3. 使您的代码易于测试。
  4. 启用更快的调试。
  5. 完全平台无关 - 您可以轻松地在多个平台上使用相同的业务逻辑并共享它们(iOS、tvOS 等)。

架构组件

  • 应用程序状态:一个单一的不可变数据结构。它包括 UI 状态、导航状态和模型层的状态。

  • 存储:包含应用程序状态,并通知某些应用程序状态的 观察者 状态的更新。

  • 减少器:一个 纯函数,它接受当前应用程序状态和一个 操作 作为输入,创建一个反映由 操作 描述的变更的新 应用程序状态,并返回新生成的 应用程序状态

  • 操作:操作描述状态变化。修改 应用程序状态 的唯一方式是将 操作 分发到 存储

  • 操作创建者和派发器:创建 操作 并将其分派到存储。

  • 应用程序状态观察者:观察存储中的 应用程序状态 并将其转换为目标数据,记录日志等。

  • 视图:呈现从 应用程序状态 衍生出的可表示数据,并将用户的交互传递给 操作创建者和派发器

它是如何工作的?

  1. 视图/视图控制器视图模型 发送事件(视图模型 的输入)。

  2. 视图模型(ViewModel)从收到的输入中创建 动作(Action) 并将其分发给 存储(Store)

  • 视图模型可以使用专用的 动作创建器(Action Creator) 来创建 动作(Action)。动作创建器可以异步工作,并根据得到的结果,返回不同的 动作(Action) 供视图模型分发。
  1. 存储(Store)应用状态(App State) 和收到的 动作(Action) 发送到 Reducer

  2. Reducer 接收到当前的 应用状态(App State) 和发送的动作,计算并返回 新的 应用状态(App State)

  3. 存储(Store)新的 应用状态(App State) 发送到订阅者。

  • 其中一个订阅者可能是一个 中间件(Middleware),它会记录通过分发动作而产生的 应用状态(App State)
  1. 视图模型接收到 新的 应用状态(App State),将其转换为可展示的数据,并将其发送到 视图/视图控制器(View/View Controller)
  • 视图模型可以使用 转换器(Transformer)应用状态(App State) 转换为可展示的数据。这有助于您在不同的视图模型中重用转换代码。
  1. 视图/视图控制器(View/View Controller) 会将用户界面渲染出来,向用户展示可展示的数据。

RxState 如何帮助您构建架构?

RxState 为您定义了主要组件:

  1. 存储(Store):以 Driver<[SubstateType]> 的形式包含 应用状态(App State)

  2. 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)
  1. 动作类型(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
}
  1. 主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
}
  1. 中间件类型(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)
        }
    }
}

依赖项

要求

  • Swift 3

安装

  • 使用 CocoaPods:
pod 'RxState'

示例

我已经尝试使 示例应用 尽可能全面。它目前在 iOS 和 macOS 上运行。注意,由于架构,只需要更改 View/View Controller 层才能将应用从 iOS 移植到 macOS。

贡献

我们很高兴看到您的参与,非常欢迎反馈和贡献 - 检查 贡献指南

影响和鸣谢

  • RxSwift:Swift 中的响应式编程。
  • Redux:一个用于 JavaScript 应用程序的预测性状态容器。

作者

Nazih Shoura,[email protected]

许可证

此库属于 RxSwiftCommunity

RxState 按照MIT许可证提供。有关更多信息,请参阅 LICENSE 文件。