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

Proper way to dispose a one-off observable in RxSwift

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

Using dispose bags or takeUntil operator is a robust way of making sure resources are cleaned up. We recommend using them in production even if the sequences will terminate in finite time.

我的 Observable 在一个事件后终止

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

假设我对取消订阅者不感兴趣,我只想 运行 一次完成。我希望这个可观察对象的生命周期在工作本身完成时结束。这意味着我看不到适合 disposeBag 的候选人。 takeUntil 还期望 'event',但我看不到好的。

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

_ = 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 事件时如何调用自身。

总而言之,对于此用例,_ = 是可行的方法。