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<Event> 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<State>) -> Observable<Event> where WeakOwner: AnyObject 类型
UI.bind(self) { me, state -> UI.Bindings<Event> in
// state type 为 ObservableSchedulerContext<State>
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<Event>,subscriptions bind 相关操作,events 相关事件
return UI.Bindings(subscriptions: subscriptions, events: events)
}