Rx 是通过 Observable
接口表达的 通用计算抽象,允许您从 Observable
流中广播和订阅值和其他事件。
RxSwift 是 Reactive Extensions 标准的 Swift 特定实现。
虽然这个版本旨在保持对 Rx 的原始精神和命名约定的忠实,该项目还旨在提供一个真正的 Swift 首选 API 用于 Rx API。
Cross 平台文档可以在 ReactiveX.io 上找到。
像其他 Rx 实现
RxSwift 的意图是通过 序列的抽象,使异步操作和数据流以 Observable
对象的形式以及一系列转换和组合这些异步工作片段的方法变得容易。
我来到这里是因为我想...
- ...理解为什么使用 Rx?
- 基础,开始使用 RxSwift
- 关于 traits -
Single
、Completable
、Maybe
、Driver
和ControlProperty
是什么...以及它们为什么会存在? - 测试
- 技巧和常见错误
- 调试
- Rx 背后的数学
- 什么是热和冷的可观察序列?
... 安装
- 将 RxSwift/RxCocoa 集成到我的应用中。 安装指南
... 修改方案
- 使用示例应用。 运行示例应用
- 在 Playgrounds 中使用操作符。 Playgrounds
... 交互
- 这一切都很棒,但能与使用 RxSwift 的人交流并交换经验会更好。
加入 Slack 频道 - 报告使用库时的问题。 使用问题模板报告问题
- 请求新功能。 使用功能请求模板报告问题
- 协助 查看贡献指南
... 比较
... 理解结构
RxSwift 的结构性与它所驱动的异步工作一样。核心单元是 RxSwift 本身,而其他的依赖可以被添加以提高 UI 工作、测试等。
它由以下五个相互依赖的组件组成
┌──────────────┐ ┌──────────────┐
│ RxCocoa ├────▶ RxRelay │
└───────┬──────┘ └──────┬───────┘
│ │
┌───────▼──────────────────▼───────┐
│ RxSwift │
└───────▲──────────────────▲───────┘
│ │
┌───────┴──────┐ ┌──────┴───────┐
│ RxTest │ │ RxBlocking │
└──────────────┘ └──────────────┘
- RxSwift:RxSwift 的核心,提供由 ReactiveX (主要)定义的 Rx 标准。它没有其他依赖。
- RxCocoa:为 iOS/macOS/watchOS & tvOS 应用开发提供 Cocoa 特定功能,如共享序列、属性等。它依赖于
RxSwift
和RxRelay
。 - RxRelay:提供
PublishRelay
、BehaviorRelay
和ReplayRelay
,围绕 Subjects 的三个简单包装。它依赖于RxSwift
。 - RxTest 和 RxBlocking:为基于 Rx 的系统提供测试功能。它依赖于
RxSwift
。
用法
要求
- Xcode 12.x
- Swift 5.x
对于 Xcode 11 及以下版本,请使用 RxSwift 5.x。
安装
RxSwift 不包含任何外部依赖。
目前支持的安装选项如下
手动
打开 Rx.xcworkspace,选择 RxExample
并点击运行。此方法将构建所有内容并运行示例应用程序
CocoaPods
# Podfile
use_frameworks!
target 'YOUR_TARGET_NAME' do
pod 'RxSwift', '6.5.0'
pod 'RxCocoa', '6.5.0'
end
# RxTest and RxBlocking make the most sense in the context of unit/integration tests
target 'YOUR_TESTING_TARGET' do
pod 'RxBlocking', '6.5.0'
pod 'RxTest', '6.5.0'
end
将 YOUR_TARGET_NAME
替换,然后在 Podfile
目录中输入以下内容
$ pod install
XCFrameworks
从RxSwift 6开始,每个版本都包含*.xcframework
框架的二进制文件。
只需将所需的框架二进制文件拖到您的目标项目常规选项卡下的框架、库和嵌入内容部分。
注意:如果您使用的是
RxCocoa
,在导入RxCocoa
之前,务必也拖动RxCocoaRuntime.xcframework。
Carthage
将以下内容添加到Cartfile
github "ReactiveX/RxSwift" "6.5.0"
$ carthage update
将Carthage作为静态库
Carthage默认将RxSwift构建为动态库。
如果您想使用Carthage将RxSwift构建为静态库,可以使用以下脚本在构建之前手动修改框架类型:
carthage update RxSwift --platform iOS --no-build
sed -i -e 's/MACH_O_TYPE = mh_dylib/MACH_O_TYPE = staticlib/g' Carthage/Checkouts/RxSwift/Rx.xcodeproj/project.pbxproj
carthage build RxSwift --platform iOS
Swift Package Manager
注意:Swift Package Manager中存在一个关键的跨依赖项错误,影响了许多项目,包括RxSwift。我们在2020年初提交了一个错误(SR-12303),但尚未得到回复。您的体验可能会有所不同。部分解决方案可以在这里找到此处。
创建一个Package.swift
文件。
// swift-tools-version:5.0
import PackageDescription
let package = Package(
name: "RxTestProject",
dependencies: [
.package(url: "https://github.com/ReactiveX/RxSwift.git", .exact("6.5.0"))
],
targets: [
.target(name: "RxTestProject", dependencies: ["RxSwift", "RxCocoa"])
]
)
$ swift build
要使用RxTest依赖项构建或测试一个模块,设置TEST=1
。
$ TEST=1 swift test
手动使用git子模块
- 将RxSwift添加为子模块
$ git submodule add [email protected]:ReactiveX/RxSwift.git
- 将
Rx.xcodeproj
拖到项目导航器中 - 转到“项目 > 目标 > 构建阶段 > 链接二进制与库”,点击
+
并选择RxSwift
、RxCocoa
和RxRelay
目标
参考资料
- http://reactivex.io/
- Reactive Extensions GitHub (GitHub)
- RxSwift RayWenderlich.com 书籍
- RxSwift: 解除难题神话 (YouTube)
- Boxue.io RxSwift 在线课程 (中文
🇨🇳 ) - 专家面对面:Brian Beckman 和 Erik Meijer - .NET Reactive Framework(Rx)内部 (视频)
- 响应式编程概览 (Netflix 的 Jafar Husain)
- Subject/Observer 是 Iterator 的对立面 (论文)
- Rx 标准序列操作符可视化 (可视化工具)
- Haskell