RxSwift:iOS 开发者的响应式编程工具箱
RxSwift:iOS 开发者的响应式编程工具箱
RxSwift 在 GitHub 上拿到了 24,651 颗 Star,是 Reactive Extensions 在 Swift 生态里的官方实现。
做 iOS 开发的人大概都遇到过这种场景:一个搜索框,用户每敲一个字就要请求接口、刷新列表、处理加载状态、管理错误提示。用回调嵌套来写,代码很快变成一团难以维护的面条。RxSwift 提供的思路是把这些异步操作统一成 Observable 流,用一条算子链来完成数据的传递和变换。
它解决了什么问题
iOS 开发里异步操作的来源很多:网络请求、数据库查询、KVO 监听、用户手势、定时器。传统做法是每种都用不同的回调模式处理,彼此之间很难组合。
RxSwift 把这些全部抽象成 Observable 序列。不管数据从哪来,都可以用 map、filter、flatMap 这些操作符来处理,不同来源的数据流还能合并、竞争、节流。代码从嵌套回调变成线性管道,可读性和可维护性都上了一个台阶。

整体架构
RxSwift 由五个模块组成,各自分工明确:
- RxSwift:核心库,实现 Rx 标准的 Observable、Operator、Scheduler 等基础能力,无外部依赖
- RxCocoa:为 iOS/macOS/tvOS/watchOS 提供 UI 绑定能力,比如把 Observable 直接绑定到 UITableView
- RxRelay:提供 PublishRelay 和 BehaviorRelay,是对 Subject 的轻量封装,不会发送 onComplete 事件
- RxTest 和 RxBlocking:测试辅助工具,前者用于调度器时间控制,后者用于同步阻塞等待
模块之间是单向依赖关系:RxCocoa 依赖 RxSwift 和 RxRelay,RxTest 和 RxBlocking 只依赖 RxSwift。按需引入即可,不用全装。

一个实际例子
假设要做 GitHub 仓库搜索,输入框每次输入后 300 毫秒防抖,去重,空查询返回空列表,非空查询发起网络请求,结果绑定到 TableView。用 RxSwift 写出来是这样:
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)
searchResults
.bind(to: tableView.rx.items(cellIdentifier: "Cell")) {
(index, repository: Repository, cell) in
cell.textLabel?.text = repository.name
}
.disposed(by: disposeBag)
搜索防抖、空查询过滤、请求取消、结果绑定,全在一条链里完成。
安装方式
支持 Carthage、Swift Package Manager、XCFramework 拖拽、Git Submodule 四种方式。SPM 用户在 Package.swift 里加一行依赖即可:
.package(url: "https://github.com/ReactiveX/RxSwift.git", from: "6.0.0")
Carthage 用户在 Cartfile 里写上版本号,跑 carthage update 就行。6.0 之后的版本还提供了预编译的 xcframework,下载拖进项目就能用。
适合什么场景
- 界面逻辑复杂、多个数据源需要联动的 iOS 应用
- 需要精细控制异步流程的场景,比如请求取消、重试、超时
- 团队已经熟悉 Rx 概念,想在 Swift 项目里落地的情况
如果你的项目异步逻辑简单,或者已经在用 Apple 的 Combine,引入 RxSwift 的必要性不大。它解决的是中大型项目里异步代码组织的问题,小项目用反而增加了认知负担。
pple 的 Combine,引入 RxSwift 的必要性不大。它解决的是中大型项目里异步代码组织的问题,小项目用反而增加了认知负担。
更多推荐

所有评论(0)