22

我有一个我只想启动一次的 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 { ... }

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

4

1 回答 1

35

两者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

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

于 2016-03-10T09:15:10.010 回答