RxFeedback

RxFeedback

RxFeedback 是用于 RxSwift 的一个架构

为什么要使用它

  • 简单
    • 如果它是一个状态那么它就是一个 State
    • 如果这是一种修改状态的方法那么它就是一个 Event/Command
    • 如果它是一个作用,将其编码为状态的一部分,然后设计一个反馈循环
  • 声明
    • 系统行为首先声明指定并且在订阅后的作用,编译时期保证,没有 "未处理状态"
  • 调试容易
    • 很多逻辑都是纯函数
  • 可用于很多层次
    • Entire system
    • 应用状态的存储 (CoreData, Firebase, Realm)
    • ViewController state 存储在 system 操作中
    • 在 feedback loop 可以有另一个 feedback loop
  • 可以很好的依赖注入
  • 容易测试
    • Reducer 是纯函数,可以对它进行 assert
    • 在某些情况作用可以被测试
  • 可以模拟循环依赖
  • 可以从作用中分离业务逻辑
  • 业务逻辑可以在平台之间进行转换

Example

Observable.system(
    initialState: 0,
    reduce: { (state, event) -> State in
        switch event {
        case .increment:
            return state + 1
        case .decrement:
            return state - 1
        }
    },
    scheduler: MainScheduler.instance,
    scheduledFeedback:
    UI.bind(self) { me, state -> UI.Bindings in
        let subscriptions = [
            state.map(String.init).bind(to: me.countLabel.rx.text)
        ]
        
        let events = [
            me.plusBtn.rx.tap.map { Event.increment },
            me.minusBtn.rx.tap.map { Event.decrement }
        ]
        return UI.Bindings(subscriptions: subscriptions, events: events)
    }
)
.subscribe()
.addDisposableTo(disposeBag)
  • initialState 初始化的值
  • reduce 纯函数,event 发送了,然后执行相关的操作,返回 state
  • scheduler 指定 scheduler
  • scheduledFeedback 指定 scheduledFeedback,返回 (ObservableSchedulerContext) -> Observable where WeakOwner: AnyObject 类型
UI.bind(self) { me, state -> UI.Bindings in
    // state type 为 ObservableSchedulerContext
    let subscriptions = [
        state.map(String.init).bind(to: me.countLabel.rx.text)
    ]
    
    let events = [
        me.plusBtn.rx.tap.map { Event.increment },
        me.minusBtn.rx.tap.map { Event.decrement }
    ]
    // 返回 Bindings,subscriptions bind 相关操作,events 相关事件
    return UI.Bindings(subscriptions: subscriptions, events: events)
}

你可能感兴趣的:(RxFeedback)