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:disposed(by: disposeBag) 真的有效吗?