Правильный способ утилизации одноразовых наблюдаемых в 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
после пересылки события.
В заключение, для вашего варианта использования _ =
- это путь.