Combine 会杀死 RxSwift 吗?

💡 原文中文,约5800字,阅读约需14分钟。
📝

内容提要

Combine是RxSwift的竞争对手,支持背压和取消订阅,但不支持自定义错误类型和throwing/not throwing操作符。RxSwift仍然是一个很好的选择,尤其是对于不支持iOS 13的项目。Combine的API与RxSwift相似,但在使用上可能会遇到一些问题。RxSwift社区很强大,提供了许多扩展和便利的操作符。选择使用Combine还是RxSwift取决于项目需求和开发者的喜好。

🔎

延伸解读

背压支持:Combine 的显式优势

Combine 开箱即用地支持背压,订阅者通过返回需求数量来控制接收速度,若不关心可返回 Demand.unlimited。RxSwift 历史上不支持背压,没有像 RxJava 那样分离 Flowable 和 Observable,但提供了有用的操作符和重入异常检查来应对。作者认为,尽管背压很酷,但他在大量 RxSwift 代码中从未遇到需要背压的场景,总能通过现有操作符解决。

错误类型与操作符设计差异

Combine 要求为 Publisher 指定错误类型,并区分 throwing 和 not throwing 操作符,例如可能抛错的 map 需用 tryMap。RxSwift 则统一使用 Error,操作符默认抛出闭包。作者表示,作为开发者他并不在意错误类型,更习惯 RxSwift 的默认方式,因为大多数情况下错误被抽象处理,很少使用特定错误类型。

内存管理:DisposeBag 与 Cancellable

RxSwift 的 DisposeBag 集中管理订阅生命周期,引用计数归零时自动清理,但容易引发引用循环,需要经验处理。Combine 没有类似机制,只有 Cancellable,在 ARC 下使用可能令人困惑。作者是 DisposeBag 的忠实粉丝,认为它非常方便,并举例在 Cell 中通过重置 DisposeBag 来清理订阅,而 Combine 需要为每个 Cancellable 单独编写清理代码。

迁移时机与项目考量

Combine 仅支持 iOS 13 及以上,因此现有 RxSwift 项目一两年内无需担心迁移。作者认为将代码库迁移到 Combine 相当复杂,即使 API 相似也会遇到问题,建议仅在宠物项目中尝试。如果现在开始响应式编程,RxSwift 仍是很好的选择,尤其对于不支持 iOS 13 的项目。选择取决于项目需求和开发者偏好,但 Combine 是未来趋势。

❓

Q&A

Combine与RxSwift的主要区别是什么?

Combine支持背压和取消订阅,而RxSwift不支持背压,且只需Error类型的错误处理。

在iOS 13以下的项目中,应该使用哪个框架?

在iOS 13以下的项目中,RxSwift仍然是一个不错的选择,因为Combine不支持低于iOS 13的版本。

RxSwift的内存管理是如何工作的?

RxSwift使用DisposeBag进行内存管理,允许开发者方便地管理订阅的生命周期。

Combine的API与RxSwift有何相似之处?

Combine和RxSwift的API结构相似,但在实现细节和某些功能上存在差异。

为什么开发者应该考虑使用Combine?

Combine是苹果官方推出的框架,符合现代Swift设计,未来可能成为反应式编程的主流选择。

RxSwift是否会被Combine取代?

虽然Combine可能在未来逐渐取代RxSwift,但RxSwift仍然有其存在的价值,特别是在不支持iOS 13的项目中。

🏷️

标签

➡️

继续阅读