Правильный способ утилизации одноразовых наблюдаемых в RxSwift

У меня есть наблюдаемое, что я хочу только один раз начать. Документы говорят:

Использование контейнеров для удаления или takeUntil - это надежный способ очистки ресурсов. Мы рекомендуем использовать их в производстве, даже если последовательности будут завершены за конечное время.

Мой наблюдаемый завершается только после одного события

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

Скажем, меня не интересовали отмена подписчиков на это наблюдаемое, я просто хочу, чтобы он запускался один раз и заканчивался. Я хочу, чтобы жизненный цикл этого наблюдаемого заканчивался, когда сама работа завершена. Это означает, что нет хороших кандидатов для disposeBag, которые я вижу. takeUntil также ожидает "событие", и нет хороших, которые я вижу.

Сейчас я просто решаю предупреждение, выбросив одноразовое:

_ = observeable.subscribeNext { ... }

Есть ли способ сделать это или другую парадигму, которую я должен использовать?

Ответ 1

Оба DiposeBag и takeUntil используются для отмены подписки до для получения события .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 после пересылки события.

В заключение, для вашего варианта использования _ = - это путь.