为 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>
直截了当
声明式
调试更轻松
可应用于任何层级
system
操作符内)system
操作符在反馈循环内部)与依赖注入完美配合
测试
可以建模循环依赖
完全将业务逻辑与 effects (Rx) 分离。
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 是 Cocoa 项目的依赖管理器。您可以使用以下命令安装它
$ gem install cocoapods
要使用 CocoaPods 将 RxFeedback 集成到您的 Xcode 项目中,请在您的 Podfile
中指定它
pod 'RxFeedback', '~> 3.0'
然后,运行以下命令
$ pod install
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 代码分发的工具,并已集成到 swift
编译器中。
一旦您设置了 Swift 包,添加 RxFeedback 作为依赖项就像将其添加到您的 Package.swift
的 dependencies
值中一样容易。
dependencies: [
.package(url: "https://github.com/NoTests/RxFeedback.swift.git", majorVersion: 1)
]
Cmd
,要执行哪些 effects 被编码到状态中并由反馈循环查询