RxFeedback

Travis CI platforms pod Carthage compatible Swift Package Manager compatible

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>

为什么选择 RxFeedback?

示例

简单的 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
            )
        }
)

Play Catch

简单的自动反馈循环。

完整示例

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 依赖于 RxSwiftRxCocoa,您还需要将 RxSwift.frameworkRxCocoa.framework 也拖到您的 Xcode 项目中。

Swift Package Manager

Swift Package Manager 是一个用于自动化 Swift 代码分发的工具,并已集成到 swift 编译器中。

一旦您设置了 Swift 包,添加 RxFeedback 作为依赖项就像将其添加到您的 Package.swiftdependencies 值中一样容易。

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

与其他架构的区别