RxFeedback

Travis CI platforms pod Carthage compatible Swift Package Manager compatible

作者

Krunoslav ZaherRxFeedback 的作者。他也是 RxSwift创始人以及 ReactiveX 组织 的核心成员。他有 16 年以上的编程经验( VR 引擎,BPM 系统,移动端应用程序,机器人等),最近在研究响应式编程。

介绍

RxSwift 最简单的架构

public static func system<State, Event>(
        initialState: State,
        reduce: @escaping (State, Event) -> State,
        feedback: (Observable<State>) -> Observable<Event>...
    ) -> Observable<State>

模拟一个反馈循环系统

模拟系统将在被订阅后启动,并且在订阅被释放后停止。

系统状态用 State 表示,事件用 Event 表示。


示例

Observable.system(
    initialState: 0,
    reduce: { (state, event) -> State in
            switch event {
            case .increment:
                return state + 1
            case .decrement:
                return state - 1
            }
        },
    scheduler: MainScheduler.instance,
    feedback:
        // UI is user feedback
        UI.bind(self) { me, state -> UI.Bindings<Event> in
            let subscriptions = [
                state.map(String.init).bind(to: me.label!.rx.text)
            ]
            let events = [
                me.plus!.rx.tap.map { Event.increment },
                me.minus!.rx.tap.map { Event.decrement }
            ]
            return UI.Bindings(subscriptions: subscriptions, events: events)
        }
    )

这是一个简单计数的例子,只是用于演示 RxFeedback 架构。


State

系统状态用 State 表示:

typealias State = Int
  • 这里的状态就是计数的数值

Event

事件用 Event 表示:

enum Event {
    case increment
    case decrement
}
  • increment 增加数值事件
  • decrement 减少数值事件

当产生 Event 时更新状态:

Observable.system(
    initialState: 0,
    reduce: { (state, event) -> State in
            switch event {
            case .increment:
                return state + 1
            case .decrement:
                return state - 1
            }
        },
    scheduler: MainScheduler.instance,
    feedback: ...
    )
  • increment 状态数值加一
  • decrement 状态数值减一

Feedback Loop

状态输出到 UI 页面上,或者将 UI 事件输入到反馈循环里面去:

Observable.system(
    initialState: 0,
    reduce: { ... },
    scheduler: MainScheduler.instance,
    feedback:
        // UI is user feedback
        UI.bind(self) { me, state -> UI.Bindings<Event> in
            let subscriptions = [
                state.map(String.init).bind(to: me.label!.rx.text)
            ]
            let events = [
                me.plus!.rx.tap.map { Event.increment },
                me.minus!.rx.tap.map { Event.decrement }
            ]
            return UI.Bindings(subscriptions: subscriptions, events: events)
        }
    )
  • 将状态数值用 label 显示出来
  • 将增加按钮的点击,作为增加数值事件传入
  • 将减少按钮的点击,作为减少数值事件传入

优势

这就是 RxFeedback 架构,它的优势是:

  • 简单
  • 直接
  • 容易调试
  • 能被应用到任何级别
  • 完美支持依赖注入
  • 支持循环依赖
  • 完全将业务逻辑分离(跨平台)

示例

下一节将用 Github Search 来演示如何使用 RxFeedback

results matching ""

    No results matching ""