RxFeedback
RxFeedback 是用于 RxSwift 的一個(gè)架構(gòu)
為什么要使用它
- 簡(jiǎn)單
- 如果它是一個(gè)狀態(tài)那么它就是一個(gè) State
- 如果這是一種修改狀態(tài)的方法那么它就是一個(gè) Event/Command
- 如果它是一個(gè)作用,將其編碼為狀態(tài)的一部分,然后設(shè)計(jì)一個(gè)反饋循環(huán)
- 聲明
- 系統(tǒng)行為首先聲明指定并且在訂閱后的作用,編譯時(shí)期保證,沒(méi)有 "未處理狀態(tài)"
- 調(diào)試容易
- 很多邏輯都是純函數(shù)
- 可用于很多層次
- Entire system
- 應(yīng)用狀態(tài)的存儲(chǔ) (CoreData, Firebase, Realm)
- ViewController state 存儲(chǔ)在 system 操作中
- 在 feedback loop 可以有另一個(gè) feedback loop
- 可以很好的依賴注入
- 容易測(cè)試
-
Reducer是純函數(shù),可以對(duì)它進(jìn)行 assert - 在某些情況作用可以被測(cè)試
-
- 可以模擬循環(huán)依賴
- 可以從作用中分離業(yè)務(wù)邏輯
- 業(yè)務(wù)邏輯可以在平臺(tái)之間進(jìn)行轉(zhuǎn)換
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 純函數(shù),event 發(fā)送了,然后執(zhí)行相關(guān)的操作,返回 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 相關(guān)操作,events 相關(guān)事件
return UI.Bindings(subscriptions: subscriptions, events: events)
}