RxSwift:使用 DisposeBag 的最佳实践是啥?

Posted

技术标签:

【中文标题】RxSwift:使用 DisposeBag 的最佳实践是啥?【英文标题】:RxSwift: What is the best practice to use DisposeBag?RxSwift:使用 DisposeBag 的最佳实践是什么? 【发布时间】:2018-08-05 13:32:53 【问题描述】:

现在我需要根据配置 API 更改应用程序主题(颜色),所以我使用 RxCocoa、RxSwift 框架在每个视图控制器上创建 observable 以在应用程序上应用新主题。

我的问题是使用 DisposeBag 的最佳做法是什么:

在每个视图控制器上创建新的 DisposeBag 对象? 或者对所有 observables 使用一个全局 DisposeBag?

提前致谢

【问题讨论】:

【参考方案1】:

dispose bag 的全部意义在于在销毁时处理它包含的 observables。一个全局包永远不会被破坏,这反而违背了它的目的。这等于完全无视一次性用品。

只要您知道可观察对象将在有限时间内出错/完成,就可以忽略它们,因为无论如何该链都在那个时候被处置。例如,如果您使用take(x),那么您实际上并不需要一次性用品,因为在发出规定数量的物品后,链条将完成并被处置。

另外,有趣的是,订阅按钮点击时不需要它,因为点击 Observable 将在按钮被取消时完成并释放。我怀疑其他 UI 元素的工作方式相同。

基本上,这个包是作为故障保险的......(我在回答这个问题时学到了一些东西。谢谢。)

【讨论】:

【参考方案2】:

在 ViewController 中定义 DisposeBag 将有助于管理相关 Disposable 的生命周期

这是一个简单的示例,在 ViewController 中,对 API 请求(用于 UI 相关数据)的订阅由 DisposeBag 中的 Dispoable 持有。当 ViewController 被释放时,关联的DisposeBag 将释放它所有的Disposables

此时,如果 API Request 仍处于等待状态,则会调用 URLSessionTask.cancel 以避免不必要的转发(假设 observable 构造良好)。

使用传统的回调闭包来实现这种行为非常复杂。

【讨论】:

以上是关于RxSwift:使用 DisposeBag 的最佳实践是啥?的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift:当类具有 disposeBag 属性时,始终使用 [unowned self] 是不是安全?

在 RxSwift 中手动处理 DisposeBag

RxSwift:disposed(by: disposeBag) 真的有效吗?

如何使用 RxSwift disposeBag 防止 UITableViewCell 中重复的 UIButton 点击

RxSwift 系列

谁应该在 Swift 上将 DisposeBag 保留在 MVVM(+controller) 中