RxFeedback

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)
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容