如何在 RxSwift 中取消订阅 Observable?

Posted

技术标签:

【中文标题】如何在 RxSwift 中取消订阅 Observable?【英文标题】:How to unsubscribe from Observable in RxSwift? 【发布时间】: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?

【问题讨论】:

看到这个***.com/questions/38969328/… 看看github.com/ReactiveX/RxSwift/blob/master/Documentation/…。你提到的听起来像一个错误。也许最好在github.com/ReactiveX/RxSwift/issues 将其报告为问题 【参考方案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

以上是关于如何在 RxSwift 中取消订阅 Observable?的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift:如何使用 shareReplay 懒惰地获取订阅

如何使用 RxSwift 订阅数组更改?

如何使用 RxSwift 取消之前的请求

RxSwift 共享订阅执行顺序

RxSwift 订阅序列

未调用 RxSwift 订阅块