ViewController 中的 RxSwift DisposeBag 使用

Posted

技术标签:

【中文标题】ViewController 中的 RxSwift DisposeBag 使用【英文标题】:RxSwift DisposeBag usage in ViewController 【发布时间】:2019-03-06 16:37:06 【问题描述】:

我是 RxSwift 框架的新手。我在ViewController 中使用一次性用品,并在DisposeBag 中添加一次性用品。

我应该在哪里取消分配 DisposeBag 以处理所有一次性用品?在控制器的viewDidAppeardeinit?哪种方法更安全?

【问题讨论】:

【参考方案1】:

如果你将你的 dispose 包声明为你的视图控制器子类的一个实例变量,一旦你的视图控制器被释放,它就会被自动释放。也就是说,如果它没有被其他东西保留。

【讨论】:

【参考方案2】:

一次性用品的用途是什么

Disposables 在这里代表了 observable 订阅的句柄。处理后,它会取消 observable 的操作。最直接的例子是网络请求。当这个请求相关的disposable被处理掉时,如果请求没有完成,则取消。

处理袋

Dispose bag 收集多个生命周期应该相关的一次性用品。当袋子被处理掉时,里面的所有一次性用品也会被处理掉。

在 View Controller 中处理包有什么意义

既然我们知道了一次性用品的实际作用,我们需要回答的问题不再是“我应该在哪里处理我的包”,而是“什么时候取消订阅才有意义”?

这里的答案实际上与用例有关:如果视图控制器不再出现在屏幕上,有时您会想要停止任何工作。在这种情况下,在viewDidDisappear: 中释放处理包是一个不错的选择。其他时候,最好让 dispose 包在deinit 中释放(类生命周期将处理这个问题,但您无需覆盖 deinit),在您希望 observable 继续执行其工作的情况下如果视图控制器不在屏幕上。

总而言之,没有一种方法比另一种更安全,这仅取决于您的用例。

【讨论】:

【参考方案3】:

如果你在 viewWillAppear 函数中订阅你的 observables,那么你应该在 viewDidDisappear 函数中取消你的 disposeBag。如果你在viewDidLoad订阅了你的observables,那就不用担心了,dispose bag会自动dispose的。后一种方式是标准的。

【讨论】:

以上是关于ViewController 中的 RxSwift DisposeBag 使用的主要内容,如果未能解决你的问题,请参考以下文章

在 ViewController 中可观察到的单元测试 RxSwift

使用 RxSwift 将 UITableViewCell 中的控件绑定到 ViewModel 的最佳实践

RxSwift:将 PublishSubject 绑定到多个按钮并接收发送者

如何动画从表格视图(rxswift)中删除单元格?

RxSwift 从一个创建多个 Observable

如何在MVVM架构中使用RxSwift发送参数来查看模型?