RxSwift: ReactiveX for Swift
ReactiveX(简写: Rx) 是一个可以帮助我们简化异步编程的框架。
它尝试将原有的一些概念移植到 iOS/macOS 平台。
你可以在这里找到跨平台文档 ReactiveX.io。
KVO,异步操作 和 流 全部被统一成抽象序列。这就是为什么 Rx 会如此简单,优雅和强大。
操作
加入 RxSwift QQ 交流群: 871293356
文档更新日志
22年5月6日(RxSwift 6)
- 更新文档以适配 RxSwift 6
- 加入 ReplayRelay
- 移除已过时的代码, 感谢 @sheruce, @professordeng, @JPlay
纠正错别字,修改语病, 感谢 @sheruce, @professordeng
示例
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)
必备条件
- 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
# RxTests 和 RxBlocking 将在单元/集成测试中起到重要作用
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
框架的二进制文件。
我们只用将所需框架的二进制文件拖入 Targets/{APP}/General
选项卡下的 Frameworks, Libraries, and Embedded Content 区域。
Carthage
添加到 Cartfile
github "ReactiveX/RxSwift" "6.5.0"
$ carthage update
Carthage 作为静态库。
如果您希望使用 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 里面有一个关键的
cross-dependency
bug,它影响了许多项目包括 RxSwift。我们已经在 2020 年早期提交了这个 bug (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 submodules 手动集成
- 添加 RxSwift 作为子模块
$ git submodule add git@github.com:ReactiveX/RxSwift.git
- 拖拽
Rx.xcodeproj
到项目中 - 前往
Project > Targets > Build Phases > Link Binary With Libraries
, 点击+
并且选中RxSwift
,RxCocoa
和RxRelay
目标。