在RxSwift中配置一次性observable的正确方法

时间:2016-03-09 16:51:22

标签: ios swift rx-swift

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

  

使用dispose bags或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 个答案:

答案 0 :(得分:26)

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

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