我有两个订阅:a
和 b
。一旦 b
“触发”,我需要取消(取消订阅)a
。
订阅在代码的不同部分定义,目前看起来像这样:
private let _bag = DisposeBag()
func fA() {
// ....
observableA.bind(to: mapView.rx.animate).disposed(by: _bag)
// ....
}
func fB() {
// ....
observableB.subscribe(onNext: { [unowned self] data in
self.process(data)
// I need to unsubscribe from observableA now
}).disposed(by: _bag)
// ....
}
完成它的最佳方法是什么?我可以想到两种方法:
1)使用专用包:
private let _bag = DisposeBag()
private var _ABAG = DisposeBag()
func fA() {
// ....
observableA.bind(to: mapView.rx.animate).disposed(by: _ABAG)
// ....
}
func fB() {
// ....
observableB.subscribe(onNext: { [unowned self] data in
self.process(data)
self._ABAG = DisposeBag()
}).disposed(by: _bag)
// ....
}
2) 手动取消订阅:
private let _bag = DisposeBag()
private var _disposableA: Disposable?
func fA() {
// ....
_disposableA = observableA.bind(to: mapView.rx.animate)
// ....
}
func fB() {
// ....
observableB.subscribe(onNext: { [unowned self] data in
self.process(data)
self._disposableA?.dispose()
}).disposed(by: _bag)
// ....
}
哪种方式在健壮性、优雅性等方面更好?或者有更好的方法吗?
最佳答案
您可以使用“takeUntil”运算符吗?您可以从 observableA 接收元素,直到 observableB 触发,如您所愿。
我的测试:
2019-12-30 19:18:32.016: A SUB -> Event next(())
2019-12-30 19:18:47.017: A SUB -> isDisposed
2019-12-30 19:18:47.018: B SUB -> Event next(())
observableA
.debug("A SUB", trimOutput: false)
.takeUntil(observableB)
关于ios - 另一个订阅触发后立即取消订阅的最佳做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59533373/