ios - 另一个订阅触发后立即取消订阅的最佳做法

标签 ios swift observable rx-swift

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

    // ....
}

哪种方式在健壮性、优雅性等方面更好?或者有更好的方法吗?

最佳答案

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

相关文章:

ios - Xcode 看不到 swift 子类

ios - 如何刷新表格 View 但禁用弹跳?

Angular 解析器获取 Observable

angular - 在渲染 View /模板之前等待 Angular 2 加载/解析模型

ios - 在左对齐的导航栏中添加 Logo

ios - 从另一个 View Controller 调用位于 Facebook sdk 上的函数

ios - 我收到此错误,此类与键 collectionView 的键值编码不兼容。 ,

ios - UITextField 圆角 - swift

string - Swift:字符串包含字符串(不使用 NSString)?

flutter - BannerAd.dispose 不工作 Flutter Admob