RxCocoaNetworking
这是基于 RxCocoa
构建的一个极轻量级的网络框架,专为使用 RxTest
进行测试和仿照 Moya
设计。
尽管 Moya 是基于 Alamofire 构建的,并提供了一个具有 Observable
签名的 Rx 扩展,而 RxCocoaNetworking 是基于 RxCocoa 构建的,RxCocoa 已经为 NSURLSession
提供了 Observable
签名的扩展。如果您喜欢以下优点,那么 RxCocoaNetworking 是为您定做的:
✅ 您喜欢Moya
保持网络层干净、易于阅读和可测试的特点;✅ Alamofire+Moya 的功能超出了您的需求;✅ 您的项目已经依赖于RxCocoa
。
...且以下条件会额外加分:
✅ 您希望使用RxTest
对delayed
抽象进行测试;✅ 您不喜欢在生产目标中实现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。