Обработка пустых ссылок из firebase - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть приложение, в котором я использую Firebase и RxSwift.Я получаю снимок с ссылки, и проблема, с которой я столкнулся сейчас, заключается в том, что ссылка может быть нулевой, то есть она не существует.как мне все еще заставить мой код выполняться без указания причины

, если значение равно NULL, мне следует вызвать onCompleted.

func refreshActiveTrip() -> Observable<Trip> {

        guard let trip = getCurrentTrip()  else {
            return Observable.error(RxError.noElements)
        }

        tripRef = Database.database().reference(forTransportChampionId: (getChampion()?.id)!, tripId: trip.id!)
        return Observable<Trip>.create({ (observer) -> Disposable in

            let disposable = Disposables.create {
                self.tripRef?.removeAllObservers()
            }

            self.tripRef?.observeSingleEvent(of: .value, with: { (snapshot) in
                if snapshot.exists(){

                    if let data = snapshot.value as? [String: AnyObject] {

                        let trip = Trip(dictionary: data as NSDictionary)
                        print("SPLASH TRIP CURRENT \(data)")

                        self.saveCurrentTrip(trip)
                        observer.onNext(trip)
                        observer.onCompleted()

                    }
                    print("It exists!!")
                }else{
                    let trip = Trip()
                    self.saveCurrentTrip(trip)
                    print("Nope, doesn't exist!")
                }
            })

            return disposable
        })

    }

tripRef может быть равно нулю

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Поскольку вы уже создаете 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

0 голосов
/ 13 февраля 2019

Вы можете использовать защитное разрешение для предотвращения этой нулевой ситуации.

Проверьте это,

Проверьте нулевое значение с защитным элементом вместо if?

...