RDXVM

CircleCI Version License Platform

RDXVM 是另一个受 Redux 和 ReactorKit 启发的 MVVM 实现。

示例

要运行示例项目,请克隆 repo,然后首先从 Example 目录运行 pod install

要求

依赖项

安装

RDXVM 可以通过 CocoaPods 获得。 要安装它,只需将以下行添加到您的 Podfile 中

pod 'RDXVM'

用法

ViewModel 需要 action、mutation、event 和 state 的自定义类型来继承并创建实例。

enum Action {
    case add(Int)
    case subtract(Int)
}
enum Mutation {
    case add(Int)
    case calculating(Bool)
}
enum Event {
    case notSupported
}
struct State {
    var sum = 0
    var calculating = false
}

您可以使用这些类型继承 ViewModel,并且必须重写 react(action:state:)reduce(mutation:state:) 方法。 在 react(action:state:) 中,您应该返回一个 Reaction 的 observable。

class CalcViewModel: ViewModel<Action, Mutation, State, Event> {
    init(state: State = State()) {
        super.init(state: state)
    }

    override func react(action: Action, state: State) -> Observable<Reaction> {
        switch action {
        case .add(let num):
            return .of(.mutation(.calculating(true)),
                .mutation(.add(num)),
                .mutation(.calculating(false)))
        case .subtract:
            return .just(.event(.notSupported))
        }
    }

    override func reduce(mutation: Mutation, state: inout State) {
        switch mutation {
        case let .add(let num):
            state.sum += num
        case let .calculating(let calculating):
            state.calculating = calculating
        }
    }
}

let vm = CalcViewModel<Action, Mutation, Event, State>()

将 action 发送到 ViewModel,并从 ViewModel 获取输出(event、error、state)。

addButton.rx.tap.map { Action.add(3) }
    .bind(to: vm.action)
    .disposed(by: dbag)

vm.event
    .emit()
    .disposed(by: dbag)

vm.error
    .emit()
    .disposed(by: dbag)

vm.state
    .drive()
    .disposed(by: dbag)

您可以获取状态的当前值或状态的属性。

// current state itself
vm.$state

// current value of state's property
vm.$state.sum

// '$' can be omitted to get prperty value of the state.
vm.state.sum

您可以将 @Drived 属性应用于状态的属性,这样您就可以直接驱动该属性而不是状态本身。

struct State {
    @Drived var sum = 0
    @Drived var calculating = false
}

vm.state.$sum.drive()
vm.state.$calculating.drive()

作者

skyofdwarf, skyofdwarf@gmail.com

许可

RDXVM 在 MIT 许可下可用。 有关更多信息,请参见 LICENSE 文件。