如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章