RxSwift:使用 DisposeBag 的最佳实践是什么?
RxSwift: What is the best practice to use DisposeBag?
现在我需要根据配置更改应用程序主题(颜色)API,所以我使用 RxCocoa、RxSwift 框架在每个视图控制器上创建可观察对象以在应用程序上应用新主题。
我的问题是使用 DisposeBag 的最佳实践是什么:
- 在每个视图控制器上创建新的 DisposeBag 对象?
- 或者对所有可观察对象使用一个全局 DisposeBag?
提前致谢
处理包的全部意义在于在销毁时处理它包含的可观察对象。一个全球性的包永远不会被破坏,这反而违背了它的目的。等于完全无视一次性用品。
只要您知道 observable 会在有限时间内 error/complete 就可以忽略它们,因为链条无论如何都会在那个时候被处理掉。例如,如果您使用 take(x)
那么您实际上并不需要一次性用品,因为链条将在发出禁止数量的物品后完成并被丢弃。
此外,有趣的是,订阅按钮点击时不需要它,因为点击 Observable 将在按钮取消时完成并释放。我怀疑其他 UI 元素的工作方式相同。
基本上,这个包是作为一个故障保险...(我在回答这个问题时学到了一些东西。谢谢。)
在 ViewController 中定义 DisposeBag
将有助于管理相关 Disposable
的生命周期
这是一个简单的例子,在 ViewController 中,对 API 请求(对于 UI 相关数据)的订阅由 Dispoable
在 DisposeBag
。当 ViewController 被释放时,关联的 DisposeBag
将释放其所有 Disposables
。
那时,如果 API 请求仍然未决,将调用 URLSessionTask.cancel
以避免不必要的转发(假设 observable 构造良好)。
使用传统回调闭包实现此行为非常复杂。
现在我需要根据配置更改应用程序主题(颜色)API,所以我使用 RxCocoa、RxSwift 框架在每个视图控制器上创建可观察对象以在应用程序上应用新主题。
我的问题是使用 DisposeBag 的最佳实践是什么:
- 在每个视图控制器上创建新的 DisposeBag 对象?
- 或者对所有可观察对象使用一个全局 DisposeBag?
提前致谢
处理包的全部意义在于在销毁时处理它包含的可观察对象。一个全球性的包永远不会被破坏,这反而违背了它的目的。等于完全无视一次性用品。
只要您知道 observable 会在有限时间内 error/complete 就可以忽略它们,因为链条无论如何都会在那个时候被处理掉。例如,如果您使用 take(x)
那么您实际上并不需要一次性用品,因为链条将在发出禁止数量的物品后完成并被丢弃。
此外,有趣的是,订阅按钮点击时不需要它,因为点击 Observable 将在按钮取消时完成并释放。我怀疑其他 UI 元素的工作方式相同。
基本上,这个包是作为一个故障保险...(我在回答这个问题时学到了一些东西。谢谢。)
在 ViewController 中定义 DisposeBag
将有助于管理相关 Disposable
这是一个简单的例子,在 ViewController 中,对 API 请求(对于 UI 相关数据)的订阅由 Dispoable
在 DisposeBag
。当 ViewController 被释放时,关联的 DisposeBag
将释放其所有 Disposables
。
那时,如果 API 请求仍然未决,将调用 URLSessionTask.cancel
以避免不必要的转发(假设 observable 构造良好)。
使用传统回调闭包实现此行为非常复杂。