RxFeedback 4.0.0

RxFeedback 4.0.0

测试已测试
语言语言 SwiftSwift
许可 MIT
发布最后发布2021年1月
SPM支持SPM

Krunoslav ZaherShai Mishali维护。



 
依赖关系
RxSwift~> 6.0
RxCocoa~> 6.0
 

  • Krunoslav Zaher

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>

为什么

  • 简单易懂

    • 如果发生了,则产生事件->
    • 如果应该发生,则产生请求->
    • 完成请求需要反馈循环
  • 声明式

    • 系统行为的首先以声明性方式指定,并在调用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依赖于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)
]

与其他架构的区别

  • Elm - 非常接近,效果反馈循环代替了Cmd,要执行的效果被编码到状态中并通过反馈循环查询
  • Redux - 类似于此,但反馈循环代替了中间件
  • Redux-Observable - 可观测者观察状态,而不是处于视图和状态之间的中间件内部
  • Cycle.js - 没有一个简单的解释 :),请咨询@andrestaltz
  • MVVM - 将状态和效果分开,不需要视图