2

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?
  }
}
4

1 回答 1

3

不,没有必要.disposed(by:)在每种情况下都打电话。

如果你有一个你知道最终会发送一个停止事件的 Observable,并且你知道你想继续监听那个 observable 直到它这样做,那么没有理由/不需要处理订阅,因此不需要插入一次性放入处理袋中。


原因.subscribe及其同类返回 Disposable 是为了让调用代码可以在 observable 完成之前结束订阅。调用代码通过调用dispose()返回的一次性结束订阅。否则,订阅将继续,直到源 observable 发送停止事件(完成或错误)。

如果调用代码没有处理订阅,并且源 observable 没有发送停止事件,那么即使涉及的所有其他代码已经丢失了对订阅中涉及的对象的所有引用,订阅仍将继续运行。

例如,如果你把它放在 viewDidLoad 中:

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

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

在您提供的示例中, UIButton 对象在取消初始化时发出一个完成的事件,因此如果您想在此之前一直监听按钮,则无需将一次性物品放入处置袋中。

忽略disposables意味着你需要非常清楚哪些Observables是完整的,哪些是不完整的,但是如果你有这样的理解,你可以忽略它们。请记住,下一个开发人员,或者未来的你,不会像你那样对代码有很好的理解。

于 2020-09-04T11:34:46.617 回答