📂
RxSwift
  • RxSwift 中文文档
  • 1. 为什么要使用 RxSwift?
  • 2. 你好 RxSwift!
  • 3. 函数响应式编程
    • 3.1 函数式编程
    • 3.2 函数式编程 -> 函数响应式编程
    • 3.3 数据绑定
  • 4. RxSwift 核心
    • 4.1 Observable - 可监听序列
      • Single
      • Completable
      • Maybe
      • Driver
      • Signal
      • ControlEvent
    • 4.2 Observer - 观察者
      • AnyObserver
      • Binder
    • 4.3 Observable & Observer 既是可监听序列也是观察者
      • AsyncSubject
      • PublishSubject
      • ReplaySubject
      • BehaviorSubject
      • Variable(已弃用)
      • ControlProperty
    • 4.4 Operator - 操作符
    • 4.5 Disposable - 可被清除的资源
    • 4.6 Schedulers - 调度器
    • 4.7 Error Handling - 错误处理
  • 5. 如何选择操作符?
    • amb
    • buffer
    • catchError
    • combineLatest
    • concat
    • concatMap
    • connect
    • create
    • debounce
    • debug
    • deferred
    • delay
    • delaySubscription
    • dematerialize
    • distinctUntilChanged
    • do
    • elementAt
    • empty
    • error
    • filter
    • flatMap
    • flatMapLatest
    • from
    • groupBy
    • ignoreElements
    • interval
    • just
    • map
    • merge
    • materialize
    • never
    • observeOn
    • publish
    • reduce
    • refCount
    • repeatElement
    • replay
    • retry
    • sample
    • scan
    • shareReplay
    • single
    • skip
    • skipUntil
    • skipWhile
    • startWith
    • subscribeOn
    • take
    • takeLast
    • takeUntil
    • takeWhile
    • timeout
    • timer
    • using
    • window
    • withLatestFrom
    • zip
  • 6. 更多示例
    • ImagePicker - 图片选择器
    • TableViewSectionedViewController - 多层级的列表页
    • Calculator - 计算器
  • 7. RxSwift 常用架构
    • 7.1 MVVM
      • Github Signup(示例)
    • 7.2 RxFeedback
      • Github Search(示例)
    • 7.3 ReactorKit
      • Github Search(示例)
  • 8. RxSwift 生态系统
  • 9. 学习资源
  • 10. 关于本文档
    • 10.1 文档更新日志
  • 食谱
    • RxSwift 5 更新了什么?
    • RxRelay
    • 纯函数
    • 附加作用
    • 共享附加作用
Powered by GitBook
On this page
  • RxFeedback
  • 作者
  • 介绍
  • 为什么?
  • 示例
  • State
  • Event
  • Feedback Loop
  • 安装
  • CocoaPods
  • Carthage
  • Swift Package Manager
  • 与其他架构的区别
  • 示例

Was this helpful?

  1. 7. RxSwift 常用架构

7.2 RxFeedback

PreviousGithub Signup(示例)NextGithub Search(示例)

Last updated 4 years ago

Was this helpful?

RxFeedback

作者

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

介绍

最简单的架构

typealias Feedback<State, Event> = (Observable<State>) -> Observable<Event>

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

为什么?

  • 直接

    • 已经发生 -> Event

    • 即将发生 -> Request

    • 执行 Request -> Feedback loop

    • 首先系统行为被明确声明出来,然后在调用 subscribe 后开始运作 => 编译时就保证了不会有“未处理状态”

  • 容易调试

  • 适用于任何级别

    • 应用程序(state 被储存在数据库中,CoreData, Firebase, Realm)

    • view controller (state 被储存在 system 操作符)

    • 在 feedback loop 中(feedback loop 中 调用另一个 system 操作符)

  • 容易做依赖注入

  • 易测试

  • 可以处理循环依赖

    • 业务逻辑可以在不同平台之间转换

示例

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
        bind(self) { me, state -> 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 Bindings(
                subscriptions: subscriptions,
                events: events
            )
        }
)

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
        bind(self) { me, state -> 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 Bindings(
                subscriptions: subscriptions,
                events: events
            )
        }
    )
  • 将状态数值用 label 显示出来

  • 将增加按钮的点击,作为增加数值事件传入

  • 将减少按钮的点击,作为减少数值事件传入

安装

$ gem install cocoapods

将 RxFeedback 整合到项目中来,你需要在 Podfile 中指定他:

pod 'RxFeedback', '~> 3.0'

然后运行以下命令:

$ pod install
$ brew update
$ brew install carthage

将 RxFeedback 整合到项目中来,你需要在 Cartfile 中指定他:

github "NoTests/RxFeedback" ~> 3.0

运行 carthage update 去构建框架,然后将 RxFeedback.framework 拖入到 Xcode 项目中来。由于 RxFeedback 对 RxSwift 和 RxCocoa 有依赖,所以你也需要将 RxSwift.framework 和 RxCocoa.framework 拖入到 Xcode 项目中来。

一旦你配置好了 Swift 包,添加 RxFeedback 就非常简单了,你只需要将他添加到文件 Package.swift 的 dependencies 的值中。

dependencies: [
    .package(url: "https://github.com/NoTests/RxFeedback.swift.git", majorVersion: 1)
]

与其他架构的区别

示例

大多数逻辑是 ,可以通过 xCode 调试器调试,或者将命令打印出来

Reducer 是 ,只需调用他并断言结果即可

伴随 的测试 -> TestScheduler

完全从中分离业务逻辑

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

是一个 Cocoa 项目的依赖管理工具。你可以通过以下命令安装他:

是一个分散式依赖管理工具,他将构建你的依赖并提供二进制框架。

你可以通过以下 命令安装 Carthage:

是一个自动分发 Swift 代码的工具,他已经被集成到 Swift 编译器中。

- 非常相似,feedback loop 用作 , 而不是 Cmd, 要执行的 被编码到 state 中,并且通过 feedback loop 完成请求

- 也很像,不过采用 feedback loops 而不是 middleware

- observables 观察状态,与视图和状态之间的 middleware

- 一言难尽 :),请咨询

- 将状态和 分离,而且不需要 View

下一节将用 来演示如何使用 。

声明式
纯函数
整个系统
纯函数
附加作用
附加作用
RxFeedback
CocoaPods
CocoaPods
Carthage
Carthage
Homebrew
Swift Package Manager
Swift Package Manager
Elm
附加作用
附加作用
Redux
Redux-Observable
Cycle.js
@andrestaltz
MVVM
附加作用
Github Search
RxFeedback
Krunoslav Zaher
RxFeedback
RxSwift
ReactiveX 组织
RxSwift
platforms
pod
Travis CI
Carthage compatible
Swift Package Manager compatible