RxFeedback
最简单的RxSwift架构
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>
为什么
-
简单易懂
- 如果发生了,则产生事件->
- 如果应该发生,则产生请求->
- 完成请求需要反馈循环
-
声明式
- 系统行为的首先以声明性方式指定,并在调用subscribe后开始产生作用-> 编译时间可验证没有“未处理的状态”
-
调试更简单
- 大量的逻辑都是普通的纯函数,可以使用Xcode调试器进行调试,或者直接打印命令。
-
可在任何级别应用
- 整个系统
- 应用程序(状态存储在数据库中,如CoreData、Firebase、Realm)
- 控制器(状态存储在
system
运算符中) - 反馈循环内(反馈循环内的另一个
system
运算符)
-
与依赖注入配合良好
-
测试
- Reducer是一个纯函数,只需调用它并断言结果即可
- 如果测试 Effects,则使用TestScheduler
-
可以建模循环依赖
-
完全分离业务逻辑和Effects(Rx)
- 业务逻辑可以在平台之间进行转换(ShiftJS、C++、J2ObjC)
示例
简单的UI反馈循环
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
)
}
)
玩法捕捉
简单的自动反馈循环。
Observable.system(
initialState: State.humanHasIt,
reduce: { (state: State, event: Event) -> State in
switch event {
case .throwToMachine:
return .machineHasIt
case .throwToHuman:
return .humanHasIt
}
},
scheduler: MainScheduler.instance,
feedback:
// UI is human feedback
bindUI,
// NoUI, machine feedback
react(request: { $0.machinePitching }, effects: { (_) -> Observable<Event> in
return Observable<Int>
.timer(1.0, scheduler: MainScheduler.instance)
.map { _ in Event.throwToHuman }
})
)
分页
Driver.system(
initialState: State.empty,
reduce: State.reduce,
feedback:
// UI, user feedback
bindUI,
// NoUI, automatic feedback
react(request: { $0.loadNextPage }, effects: { resource in
return URLSession.shared.loadRepositories(resource: resource)
.asSignal(onErrorJustReturn: .failure(.offline))
.map(Event.response)
})
)
运行 RxFeedback.xcodeproj
> Example
了解更多信息。
安装
CocoaPods
CocoaPods 是 Cocoa 项目的依赖管理器。你可以使用以下命令进行安装
$ gem install cocoapods
要使用 CocoaPods 将 RxFeedback 集成到 Xcode 项目中,请在你的 Podfile
中指定它
pod 'RxFeedback', '~> 3.0'
然后,运行以下命令
$ pod install
Carthage
Carthage 是一个分解依赖管理器,它可以构建你的依赖并提供二进制框架。
你可以使用 Homebrew 安装 Carthage,命令如下
$ brew update
$ brew install carthage
要使用 Carthage 将 RxFeedback 集成到你的 Xcode 项目中,请在你的 Cartfile
中指定它
github "NoTests/RxFeedback" ~> 3.0
运行carthage update
来构建框架,并将构建好的RxFeedback.framework
拖到您的Xcode项目中。由于RxFeedback
依赖于RxSwift
和RxCocoa
,您还需要将RxSwift.framework
和RxCocoa.framework
拖到您的Xcode项目中。
Swift Package Manager
Swift Package Manager(Swift包管理器)是一个用于自动化Swift代码分发的工具,并且与代码编译器集成。
设置好Swift包后,将RxFeedback作为依赖添加到Package.swift
的dependencies
值中就很简单了。
dependencies: [
.package(url: "https://github.com/NoTests/RxFeedback.swift.git", majorVersion: 1)
]
与其他架构的区别
- Elm - 非常接近,效果反馈循环代替了
Cmd
,要执行的效果被编码到状态中并通过反馈循环查询 - Redux - 类似于此,但反馈循环代替了中间件
- Redux-Observable - 可观测者观察状态,而不是处于视图和状态之间的中间件内部
- Cycle.js - 没有一个简单的解释 :),请咨询@andrestaltz
- MVVM - 将状态和效果分开,不需要视图