处理来自firebase的Null ref

问题描述 投票:0回答:2

我有一个应用程序,我使用Firebase和RxSwift。我从ref获取快照,我现在的问题是ref可以为null,即它不存在。我如何通过传递null原因使我的代码运行

如果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可以为null

swift firebase firebase-realtime-database rx-swift
2个回答
2
投票

由于您已经使用Observable.create()创建了一个Observable,因此您只需在else子句中调用observer.onCompleted()即可。

也就是说,在我看来,您应该发出您创建的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 }

据推测,上面的内容会出现在一个可以发现错误的平面图中......

最后,你应该考虑使用RxFirebase


0
投票

您可以使用guard let来防止这种情况。

看一下这个,

Check for nil with guard instead of if?

© www.soinside.com 2019 - 2024. All rights reserved.