Поскольку вы уже создаете Observable с Observable.create()
, вы можете просто вызвать observer.onCompleted()
в своем предложении else.
Тем не менее, мне кажется, что вы должны излучать объект Trip()
что вы создали вместо этого, а затем сохранили его за пределами этой функции.
Дополнительная информация:
Для того, что вы делаете, можно ожидать что-то более похожее на это:
func refreshActiveTrip(_ trip: Trip?, championId: String) -> Observable<Trip> {
guard let trip = trip else { return Observable.error(RxError.noElements) }
return Observable.create { observer in
let tripRef = Database.database().reference(forTransportChampionId: championId, tripId: trip.id!)
tripRef.observeSingleEvent(of: .value, with: { snapshot in
var trip = Trip()
if snapshot.exists(), let data = snapshot.value as? [String: AnyObject] {
trip = Trip(dictionary: data as NSDictionary)
}
observer.onNext(trip)
observer.onCompleted()
})
return Disposables.create { tripRef.removeAllObservers() }
}
}
Обратите внимание, что вышеприведенное является свободной функцией ;он не находится внутри какого-либо класса.
Чтобы полностью реализовать имеющийся у вас код, он будет использоваться следующим образом:
refreshActiveTrip(getCurrentTrip(), championId: getChampion()!.id!)
.do(onNext: { [weak self] trip in self?.saveCurrentTrip(trip) })
.filter { $0.id != nil }
Предположительно, вышеприведенное будет в flatMap, которая ловит ошибки...
Наконец, вам следует рассмотреть возможность использования RxFirebase