在 RxSwift 中处理一次性可观察的正确方法



我有一个可观察量,我只想启动一次。文档说:

使用处置袋或提取操作员是确保清理资源的有效方法。我们建议在生产中使用它们,即使序列将在有限的时间内终止。

我的可观察量仅在一个事件后终止

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

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

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

_ = observeable.subscribeNext { ... }

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

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事件时如何自行处置。

总之,对于这个用例,_ =是要走的路。

最新更新