如何在RxSwift中取消订阅Observable?

Mar*_*ina 9 ios swift rx-swift

我想取消订阅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
}
Run Code Online (Sandbox Code Playgroud)

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

小智 16

通常,最好在DisposeBag中输出所有订阅,这样当包含订阅的对象被释放时,它们也是如此.

let disposeBag = DisposeBag()

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

但是如果你想要预先杀死订阅,你只需要在你想要的时候调用dispose()

像这样:

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

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

disposable.dispose()
Run Code Online (Sandbox Code Playgroud)

但请注意,当您这样做时,您有责任将其取消分配.

  • 你不能两个都做吗?(如果没有取消分配,请将其添加到废弃袋中,并根据逻辑可能将其丢弃在块内) (3认同)

Ted*_*Ted 7

跟进 Shim 的问题

let disposeBag = DisposeBag()
var subscription: Disposable?

func setupRX() {
    subscription = button.rx.tap.subscribe(onNext : { _ in 
        print("Hola mundo")
    })
    subscription?.addDisposableTo(disposeBag)
}
Run Code Online (Sandbox Code Playgroud)

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

subscription?.dispose()
Run Code Online (Sandbox Code Playgroud)

  • 如果您已经在`subscription`中保存了Disposable,则无需将其添加到`disposeBag`中。 (2认同)