【问题标题】:Best practice to cancel subscription as soon as another subscription fires另一个订阅触发后立即取消订阅的最佳实践
【发布时间】:2019-12-30 15:45:34
【问题描述】:

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

    // ....
}

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

【问题讨论】:

    标签: ios swift observable rx-swift


    【解决方案1】:

    您可以使用“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)
    

    【讨论】:

      猜你喜欢
      • 2018-04-19
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 2020-01-05
      相关资源
      最近更新 更多