在任何情况下是否都需要调用`disposedby:`?

问题描述

作为标题,在任何情况下是否都必须调用disposed(by:)?如果是,为什么?

考虑一个像这样的简单示例:

class ViewController: UIViewController {
  let button = UIButton()

  override func viewDidLoad() {
    button.rx.tap.bind(onNext: { _ in
      print("Button tapped!")
    })
    // Does this make any retain cycle here?
  }
}

解决方法

否,不必在每种情况下都调用.disposed(by:)

如果您知道某个Observable最终将发送一个stop事件,并且您知道要一直监听该Observable直到这样做,那么就没有理由/不需要处置预订,因此不需要将一次性用品插入处理袋。


.subscribe及其类似物返回Disposable的原因是,以便调用代码可以在观察对象完成之前 结束订阅。调用代码通过在返回的一次性对象上调用dispose()结束订阅。否则,订阅将继续进行直到可观察到的源发送停止事件(完成或错误)。

如果调用代码未释放预订,并且可观察的源未发送停止事件,则预订将继续运行,即使所涉及的所有其他代码都丢失了对所涉及对象的所有引用在订阅中。

例如,如果将其放在viewDidLoad中:

_ = Observable<Int>.interval(.seconds(1),scheduler: MainScheduler.instance)
    .subscribe(onNext: { print($0) })

上面的代码将在创建它的视图控制器不再存在很长时间之后继续打印值。

在您呈现的示例中,UIButton对象 在取消初始化时会发出完成事件,因此,如果您想一直监听按钮直到发生这种情况,请将可弃置物丢弃袋子不是必需的。

忽略一次性物品意味着您需要非常清楚哪些可观察物完成而哪些没有完成,但是如果您有这种了解,您可以 忽略它们。只需记住,下一位开发人员,或者将来是您,对您的代码的了解将不如您那样。