Home Articles

在RxSwift中处理一次性observable的正确方法

Asked
Viewed 1511 times
13

我有一个观察,我只想开始一次 . 文档说:

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

我的观察结果在一次事件后终止

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

假设我对取消此观察者的订阅者不感兴趣,我只想让它运行一次并完成 . 我希望这个observable的生命周期在工作本身完成时结束 . 这意味着我无法看到disposeBag的好候选人 . takeUntil也期待一个'事件',而且我看不到好的事件 .

现在我只是通过丢弃一次性来解决警告:

_ = observeable.subscribeNext { ... }

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

1 Answer

  • 24

    DiposeBagtakeUntil 都用于取消订阅 prior 以接收 .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()
            }
        }
    }
    

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

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

Related