RxFeedback

Travis CI platforms pod Carthage compatible Swift Package Manager compatible

作者

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

介绍

RxSwift 最简单的架构

7.2 RxFeedback - 图6

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

模拟一个反馈循环系统

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

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


示例

7.2 RxFeedback - 图7

  1. Observable.system(
  2. initialState: 0,
  3. reduce: { (state, event) -> State in
  4. switch event {
  5. case .increment:
  6. return state + 1
  7. case .decrement:
  8. return state - 1
  9. }
  10. },
  11. scheduler: MainScheduler.instance,
  12. feedback:
  13. // UI is user feedback
  14. UI.bind(self) { me, state -> UI.Bindings<Event> in
  15. let subscriptions = [
  16. state.map(String.init).bind(to: me.label!.rx.text)
  17. ]
  18. let events = [
  19. me.plus!.rx.tap.map { Event.increment },
  20. me.minus!.rx.tap.map { Event.decrement }
  21. ]
  22. return UI.Bindings(subscriptions: subscriptions, events: events)
  23. }
  24. )

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


State

系统状态用 State 表示:

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

Event

事件用 Event 表示:

  1. enum Event {
  2. case increment
  3. case decrement
  4. }
  • increment 增加数值事件
  • decrement 减少数值事件

当产生 Event 时更新状态:

  1. Observable.system(
  2. initialState: 0,
  3. reduce: { (state, event) -> State in
  4. switch event {
  5. case .increment:
  6. return state + 1
  7. case .decrement:
  8. return state - 1
  9. }
  10. },
  11. scheduler: MainScheduler.instance,
  12. feedback: ...
  13. )
  • increment 状态数值加一
  • decrement 状态数值减一

Feedback Loop

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

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

优势

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

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

示例

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