【问题标题】: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?

提前致谢

【问题讨论】:

    标签: swift rx-swift rx-cocoa


    【解决方案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 构造良好)。

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

      【讨论】:

        猜你喜欢
        • 2018-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-12
        • 2011-06-07
        • 1970-01-01
        • 2012-06-13
        • 1970-01-01
        相关资源
        最近更新 更多