我有两个订阅: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)