RxSwift Logo
Build Status Supported Platforms: iOS, macOS, tvOS, watchOS & Linux

Rx 是一种通过 Observable<Element> 接口表达的 计算的通用抽象,它允许你广播和订阅来自 Observable 流的值和其他事件。

RxSwift 是 Reactive Extensions 标准的 Swift 特定实现。

RxSwift Observable Example of a price constantly changing and updating the app's UI

虽然此版本旨在忠于 Rx 的原始精神和命名约定,但此项目也旨在为 Rx API 提供真正的 Swift 优先 API。

跨平台文档可以在 ReactiveX.io 上找到。

与其他 Rx 实现一样,RxSwift 的目的是以 Observable 对象的形式轻松组合异步操作和数据流,并提供一套用于转换和组合这些异步工作的方法。

KVO 观察、异步操作、UI 事件和其他数据流都在 序列抽象 下统一起来。 这就是 Rx 如此简单、优雅和强大的原因。

我来到这里是因为我想 ...

... 了解
... 安装
... 随便摆弄
... 互动
... 比较
... 理解结构

RxSwift 与它驱动的异步工作一样具有组合性。 核心单元是 RxSwift 本身,而其他依赖项可以添加用于 UI 工作、测试等等。

它包含五个独立的组件,它们以以下方式相互依赖

┌──────────────┐    ┌──────────────┐
│   RxCocoa    ├────▶   RxRelay    │
└───────┬──────┘    └──────┬───────┘
        │                  │
┌───────▼──────────────────▼───────┐
│             RxSwift              │
└───────▲──────────────────▲───────┘
        │                  │
┌───────┴──────┐    ┌──────┴───────┐
│    RxTest    │    │  RxBlocking  │
└──────────────┘    └──────────────┘

用法

这是一个例子 实际操作
定义搜索 GitHub 存储库 ...
let searchResults = searchBar.rx.text.orEmpty
    .throttle(.milliseconds(300), scheduler: MainScheduler.instance)
    .distinctUntilChanged()
    .flatMapLatest { query -> Observable<[Repository]> in
        if query.isEmpty {
            return .just([])
        }
        return searchGitHub(query)
            .catchAndReturn([])
    }
    .observe(on: MainScheduler.instance)
... 然后将结果绑定到你的 tableview
searchResults
    .bind(to: tableView.rx.items(cellIdentifier: "Cell")) {
        (index, repository: Repository, cell) in
        cell.textLabel?.text = repository.name
        cell.detailTextLabel?.text = repository.url
    }
    .disposed(by: disposeBag)

安装

RxSwift 不包含任何外部依赖项。

以下是当前支持的安装选项

手动

打开 Rx.xcworkspace,选择 RxExample 并点击运行。 此方法将构建所有内容并运行示例应用程序

CocoaPods

# Podfile
use_frameworks!

target 'YOUR_TARGET_NAME' do
    pod 'RxSwift', '6.9.0'
    pod 'RxCocoa', '6.9.0'
end

# RxTest and RxBlocking make the most sense in the context of unit/integration tests
target 'YOUR_TESTING_TARGET' do
    pod 'RxBlocking', '6.9.0'
    pod 'RxTest', '6.9.0'
end

替换 YOUR_TARGET_NAME,然后在 Podfile 目录中,输入

$ pod install

XCFrameworks

从 RxSwift 6 开始的每个版本都包含 *.xcframework 框架二进制文件。

只需将所需的框架二进制文件拖到目标 General 选项卡下的 Frameworks, Libraries, and Embedded Content 部分即可。

XCFrameworks instructions

提示

你可以通过与 Xcode 15+ 中的以下指纹进行比较来验证二进制文件的身份

BD 80 2E 79 4C 8A BD DA 4C 3F 5D 92 B3 E4 C4 FB FA E4 73 44 10 B9 AD 73 44 2E F1 CE B0 27 61 40

XCFrameworks Signature Fingerprint in Xcode 15+

Carthage

将此添加到 Cartfile

github "ReactiveX/RxSwift" "6.9.0"
$ carthage update

Carthage 作为静态库

Carthage 默认将 RxSwift 构建为动态库。

如果你希望使用 Carthage 将 RxSwift 构建为静态库,你可以使用下面的脚本在用 Carthage 构建之前手动修改框架类型

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: "RxProject",
  dependencies: [
    .package(url: "https://github.com/ReactiveX/RxSwift.git", .upToNextMajor(from: "6.0.0"))
  ],
  targets: [
    .target(name: "RxProject", dependencies: ["RxSwift", .product(name: "RxCocoa", package: "RxSwift")]),
  ]
)
$ swift build

要构建或测试具有 RxTest 依赖项的模块,请设置 TEST=1

$ TEST=1 swift test

使用 git 子模块手动安装

$ git submodule add git@github.com:ReactiveX/RxSwift.git

参考文献