ViewController 中的 RxSwift DisposeBag 使用
Posted
技术标签:
【中文标题】ViewController 中的 RxSwift DisposeBag 使用【英文标题】:RxSwift DisposeBag usage in ViewController 【发布时间】:2019-03-06 16:37:06 【问题描述】:我是 RxSwift
框架的新手。我在ViewController
中使用一次性用品,并在DisposeBag
中添加一次性用品。
我应该在哪里取消分配 DisposeBag
以处理所有一次性用品?在控制器的viewDidAppear
或deinit
?哪种方法更安全?
【问题讨论】:
【参考方案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 的最佳实践