RxCocoaNetworking 0.2.2

RxCocoaNetworking 0.2.2

Marcelo Gobetti 维护。



RxCocoaNetworking

这是基于 RxCocoa 构建的一个极轻量级的网络框架,专为使用 RxTest 进行测试和仿照 Moya 设计。

Swift 4.2 codecov.io Platforms

CocoaPods compatible Carthage compatible Swift Package Manager

尽管 Moya 是基于 Alamofire 构建的,并提供了一个具有 Observable 签名的 Rx 扩展,而 RxCocoaNetworking 是基于 RxCocoa 构建的,RxCocoa 已经为 NSURLSession 提供了 Observable 签名的扩展。如果您喜欢以下优点,那么 RxCocoaNetworking 是为您定做的:

  • 您喜欢 Moya 保持网络层干净、易于阅读和可测试的特点;
  • Alamofire+Moya 的功能超出了您的需求;
  • 您的项目已经依赖于 RxCocoa

...且以下条件会额外加分:

  • 您希望使用 RxTestdelayed 抽象进行测试;
  • 您不喜欢在生产目标中实现 sampleData
  • 您认为您可以使用更少的代码来编写您使用的简单 API。

注意,这绝对不能替代 Alamofire+Moya 的全部功能。例如,您可能会错过一些只有当 RxCocoaNetworking 保持非常轻量时才会支持的功能,例如:

  • 成功响应除了 Data 之外的其他任何内容;
  • 文件上传;
  • 插件(拦截器)。

...在这种情况下,使用 Alamofire+Moya 会更好。

这个框架是由于嵌入式在 RxCocoa 中的网络请求处理以及 Swift 4.1 的条件遵从(请参阅 ReactiveURLSessionProtocol)才得以实现的。

要求

  • 📱iOS 9.0+ / Mac OS X 10.11+ / tvOS 10.0+ / watchOS 3.0+
  • 🛠Xcode 9.3+
  • ✈️Swift 4.1+
  • ⚠️RxCocoa
  • 🔥无需使用 Alamofire

用法

如果你已经熟悉 Moya,那么好消息是 RxCocoaNetworking (有意)具有非常相似的架构!你所需要做的就是创建一个表示你的 API 的结构 —— 推荐使用 enum,然后让它实现其中一个 TargetType 协议。对你的 API 的请求由一个 Provider 管理并指定为你的具体的 TargetType

无论你是否熟悉 Moya,其他好消息是你可以参考 ExampleAPI 及其 规范

汇总 `ExampleAPI`

enum ExampleAPI {
  // Endpoints as cases:
  case rate(movieID: String, rating: Float)
  case reviews(movieID: String, page: Int)
}

extension ExampleAPI: ProductionTargetType {
  // Your API's base URL is usually what determines an API enum.
  var baseURL: URL { return URL(string: "...")! }
  
  var path: String {
    switch self {
    case .rate(let movieID, _):
      return "/movie/\(movieID)/rating"
    case .reviews(let movieID, _):
      return "/movie/\(movieID)/reviews"
    }
  }
  
  var task: Task {
    // Specify GET/POST/etc., body and query parameters:
    switch self {
    case .rate(_, let rating):
      return Task(method: .post, dictionaryBody: ["value": rating])
    case .reviews(_, let page):
      return Task(parameters: parameters)
    }
  }
  
  var headers: [String : String]? { return nil }
}

extension ExampleAPI: TargetType {
  var sampleData: Data {
    ...
  }
}

常规网络请求(无模拟)

let provider = Provider<ExampleAPI>()

默认的 Provider 参数通常是你生产代码中会用到的。

即时的网络响应模拟

let provider = Provider<ExampleAPI>(stubBehavior: .immediate(stub: .default))

stub: .default 意味着将使用你的 API 的 sampleData。其他 Stub 类型允许你指定不同的响应。

注意:如果你实现了 ProductionTargetType,则无法使用 stub: .default,因为该协议不要求 sampleData👌你可以始终在测试目标中单独实现 TargetType,例如。

RxTest 可测试的延迟响应模拟

let testScheduler = TestScheduler(initialClock: 0)
let provider = Provider<ExampleAPI>(stubBehavior: .delayed(time: 3,
                                                           stub: .error(SomeError.anError)),
                                    scheduler: testScheduler)

订阅发生 3 个虚拟时间单位后发出 error

安装

依赖管理器

CocoaPods

CocoaPods 是 Cocoa 项目的依赖管理器。您可以使用以下命令安装它

$ gem install cocoapods

要使用 CocoaPods 将 RxCocoaNetworking 集成到您的 Xcode 项目中,请在您的 Podfile 中指定它

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'

pod 'RxCocoaNetworking', '~> 0.2.2'

然后,运行以下命令

$ pod install
Carthage

Carthage 是一个去中心化的依赖管理器,它可以自动化将框架添加到您的 cocoa 应用程序中的过程。

您可以使用以下命令通过 Homebrew 安装 Carthage

$ brew update
$ brew install carthage

要使用 Carthage 将 RxCocoaNetworking 集成到您的 Xcode 项目中,请在您的 Cartfile 中指定它

github "gobetti/RxCocoaNetworking" ~> 0.2.2
Swift 包管理器

要使用 RxCocoaNetworking 作为 Swift 包管理器 包,只需在您的 Package.swift 文件中添加以下代码。

// swift-tools-version:4.1
import PackageDescription

let package = Package(
    name: "HelloRxCocoaNetworking",
    dependencies: [
        .package(url: "https://github.com/gobetti/RxCocoaNetworking.git", .upToNextMajor(from: "0.2.2"))
    ],
    targets: [
        .target(name: "HelloRxCocoaNetworking", dependencies: ["RxCocoaNetworking"])
    ]
)

手动

如果您不想使用上述任一的依赖管理器,您可以将 RxCocoaNetworking 手动集成到项目中。

Git 子模块

  • 打开终端,cd 到您顶级项目目录中,运行以下命令,如果您的项目还没有作为一个 git 仓库初始化
$ git init
  • 通过运行以下命令将 RxCocoaNetworking 添加为 git 子模块
$ git submodule add https://github.com/gobetti/RxCocoaNetworking.git
$ git submodule update --init --recursive
  • 打开新的 RxCocoaNetworking 目录,并将 RxCocoaNetworking.xcodeproj 拖动到您的应用程序 Xcode 项目的项目导航器中。

    它应该出现在您应用程序蓝色项目图标下方的嵌套位置。它在所有其他 Xcode 组之上或之下无关紧要。

  • 选择项目导航器中的 RxCocoaNetworking.xcodeproj 并验证部署目标与您的应用程序目标匹配。

  • 接下来,在项目导航器(蓝色项目图标)中选择您的应用程序项目,导航到目标配置窗口,在侧边栏中选择“targets”标题下的应用程序目标。

  • 在该窗口的标签栏上,打开“General”面板。

  • 在“embedded binaries”部分下点击“+”按钮。

  • 您将看到两个不同的 RxCocoaNetworking.xcodeproj 文件夹,每个文件夹中都有一个嵌套在 Products 文件夹中的两个不同版本的 RxCocoaNetworking.framework

    您选择哪个 Products 文件夹无关紧要。

  • 选择 RxCocoaNetworking.framework

  • 就是这样!

RxCocoaNetworking.framework 作为目标依赖项、链接框架和嵌入框架自动添加到复制文件构建阶段,这是在模拟器和设备上构建所需的所有内容。

嵌入式二进制文件

  • https://github.com/gobetti/RxCocoaNetworking/releases 下载最新版本。
  • 接下来,在项目导航器(蓝色项目图标)中选择您的应用程序项目,导航到目标配置窗口,在侧边栏中选择“targets”标题下的应用程序目标。
  • 在该窗口的标签栏上,打开“General”面板。
  • 在“embedded binaries”部分下点击“+”按钮。
  • 添加下载的 RxCocoaNetworking.framework
  • 就是这样!

参与贡献

欢迎参与问题和拉取请求!

一旦你克隆了项目,在构建之前你需要做的所有事就是安装 Carthage 依赖项。

$ carthage bootstrap

然后为了成功运行单元测试,你需要后台运行 wiremock 脚本。

$ ./script/wiremock.sh

作者

Marcelo Gobetti @mwgobetti

许可证

RxCocoaNetworking 在 MIT 许可证下发布。有关详细信息,请参阅 LICENSE