另一个订阅触发时取消订阅的最佳做法

问题描述 投票:0回答:1

我有两个订阅:abb触发后,我需要取消(取消订阅)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)

    // ....
}

在健壮性,优雅性等方面,哪种方法更好?还是有更好的方法?

ios swift observable rx-swift
1个回答
2
投票

您可以使用“ 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)
© www.soinside.com 2019 - 2024. All rights reserved.