【问题标题】:How to unsubscribe from Observable in RxSwift?如何在 RxSwift 中取消订阅 Observable?
【发布时间】:2016-10-12 11:00:40
【问题描述】:

我想在 RxSwift 中取消订阅 Observable。为了做到这一点,我曾经将 Disposable 设置为 nil。但在我看来,更新到 RxSwift 3.0.0-beta.2 后,这个技巧不起作用,我无法取消订阅 Observable:

//This is what I used to do when I wanted to unsubscribe
var cancellableDisposeBag: DisposeBag?

func setDisposable(){
    cancellableDisposeBag = DisposeBag()
}

func cancelDisposable(){
    cancellableDisposeBag = nil
}

那么可能有人可以帮助我如何正确取消订阅 Observable?

【问题讨论】:

标签: ios swift rx-swift


【解决方案1】:

一般来说,将所有订阅都放在 DisposeBag 中是一种很好的做法,因此当包含订阅的对象被释放时,它们也会被释放。

let disposeBag = DisposeBag()

func setupRX() {
   button.rx.tap.subscribe(onNext : { _ in 
      print("Hola mundo")
   }).addDisposableTo(disposeBag)
}

但是如果你有一个订阅,你想提前杀死你,你只需在你想要的时候调用 dispose() 就可以了

像这样:

let disposable = button.rx.tap.subcribe(onNext : {_ in 
   print("Hallo World")
})

您可以随时调用此方法并取消订阅。

disposable.dispose()

但请注意,当您这样做时,您有责任将其释放。

【讨论】:

  • 你不能两者都做吗? (将其添加到处理包中,以防它没有被释放,并且还可能根据逻辑将其丢弃在块内)
  • 正如@shim 建议的那样,我两者都做:我存储对 Disposable 的引用,以便以后可以手动调用 dispose() (从而有效地取消订阅),但我也调用 .dispose (by: _disposeBag) 当我创建订阅时。
  • @Daniel 如何将您的解决方案应用于BehaviorRelay
【解决方案2】:

跟进对 Shim 问题的回答

let disposeBag = DisposeBag()
var subscription: Disposable?

func setupRX() {
    subscription = button.rx.tap.subscribe(onNext : { _ in 
        print("Hola mundo")
    })
}

你以后仍然可以调用这个方法

subscription?.dispose()

【讨论】:

  • 如果您已经在subscription中保存了Disposable,则无需将其添加到disposeBag
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 2016-12-20
相关资源
最近更新 更多