【问题标题】:Proper way to dispose a one-off observable in RxSwift在 RxSwift 中处理一次性 observable 的正确方法
【发布时间】:2016-06-24 04:29:41
【问题描述】:

我有一个我只想启动一次的 observable。文档说:

使用 dispose bag 或 takeUntil 运算符是确保资源得到清理的可靠方法。我们建议在生产中使用它们,即使序列将在有限时间内终止。

我的 observable 在一个事件后终止

let observable = Observable.create() { observer in
  webservice.makeHTTPRequestWithCompletionBlock {
    if something {
      observer.on(.Next(...))
      observer.onCompleted()
    } else {
      observer.on(.Error(...))
    }
  }
}

假设我对取消此 observable 的订阅者不感兴趣,我只想让它运行一次并完成。我希望这个 observable 的生命周期在工作本身完成时结束。这意味着我可以看到 disposeBag 没有好的候选人。 takeUntil 还期待一个“事件”,我看不到好的事件。

现在我只是通过扔掉一次性用品来解决警告:

_ = observeable.subscribeNext { ... }

有没有办法做到这一点,或者我应该使用不同的范例?

【问题讨论】:

    标签: ios swift rx-swift


    【解决方案1】:

    DiposeBagtakeUntil 都用于在接收.Completed/.Error 事件之前取消订阅。

    Observable 完成后,用于管理订阅的所有资源都会自动释放。

    从 RxSwift 2.2 开始,您可以在 AnonymousObservable.swift 中见证此行为的实现示例

    func on(event: Event<E>) {
        switch event {
        case .Next:
            if _isStopped == 1 {
                return
            }
            forwardOn(event)
        case .Error, .Completed:
            if AtomicCompareAndSwap(0, 1, &_isStopped) {
                forwardOn(event)
                dispose()
            }
        }
    }
    

    查看AnonymousObservableSink 在转发事件后收到.Error.Completed 事件时如何调用自身的 dispose。

    总之,对于这个用例,_ = 是可行的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 2023-03-22
      相关资源
      最近更新 更多