Swift 处理来自firebase的Null ref

Swift 处理来自firebase的Null ref,swift,firebase,firebase-realtime-database,rx-swift,Swift,Firebase,Firebase Realtime Database,Rx Swift,我有一个使用Firebase和RxSwift的应用程序。我从一个ref获取快照,现在的问题是ref可能为null,即它不存在。我如何让我的代码通过空原因运行 如果为Null,我应该调用onCompleted func refreshActiveTrip() -> Observable<Trip> { guard let trip = getCurrentTrip() else { return Observable.error(RxE

我有一个使用Firebase和RxSwift的应用程序。我从一个ref获取快照,现在的问题是ref可能为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
        })

    }
func refreshActiveTrip()->可观察{
保护让跳闸=getCurrentTrip()其他{
返回可观测误差(RxError.noElements)
}
tripRef=Database.Database().reference(forTransportChampionId:(getChampion()?.id)!,tripId:trip.id!)
返回可观察的。在中创建({(观察者)->一次性
让一次性的=一次性的。创建{
self.tripRef?.removeAllObservers()
}
self.tripRef?.observeSingleEvent(的值为:),其中:{(快照)位于
如果snapshot.exists()存在{
如果let data=snapshot.value as?[字符串:AnyObject]{
让跳闸=跳闸(字典:数据作为NSDictionary)
打印(“飞溅跳闸电流\(数据)”)
自救电流跳闸(跳闸)
onNext观察员(trip)
observer.onCompleted()
}
打印(“它存在!!”)
}否则{
让trip=trip()
自救电流跳闸(跳闸)
打印(“不,不存在!”)
}
})
一次性退货
})
}

tripRef
可以为空

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

看看这个


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

看看这个


由于您已经使用
Observable.create()
创建了一个Observable,您只需在else子句中调用
Observable.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 }
想必,上面的内容会出现在捕获错误的平面图中


<>最后,您应该考虑使用

,因为您已经创建了一个可观察的“代码>可观察性.CREATE())/代码>,您可以简单地调用您的EXEL子句中的“代码>观测器.OnEndoDeD())/<代码> < /P> 也就是说,在我看来,您应该发出您创建的
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 }
想必,上面的内容会出现在捕获错误的平面图中


<> P>最后,您应该考虑使用R/FixBASE来帮助解决这个问题吗?<代码>调用“filter”的结果是未使用的< /代码>。我希望能够调用一个函数,比如<代码>刷新活动()。(OnNeX:{弱自旅行在Surviv.Soal.SaveCurrrTrIP(TRIP)StHealEppEd()).filter{$0.id!=nil}showHomePage(),这与调用原始
refreshActiveTrip()
时得到的警告相同,并以相同的方式解决。请记住,除非您订阅了observeSingleEvent,否则observeSingleEvent不会执行任何操作。RxFirebase已经在数据库对象周围拥有了所有反应式包装器,并调用了类似于
observeSingleEvent(of:with:)
所以你不必自己实现它们。RXFirebase如何帮助解决这个问题?
调用“filter”的结果未被使用
我希望能够调用类似于
refreshActiveTrip()的函数。do(onNext:{[weak self]trip in self?.source.saveCurrentTrip(trip)showHomePage()}).过滤器{$0.id!=nil}
showHomePage(),这与调用原始
refreshActiveTrip()
时得到的警告相同,并以相同的方式解决。请记住,除非您订阅了Observables,否则Observables不会做任何事情。RxFirebase已经拥有了数据库对象周围的所有反应式包装器和调用,如
observeSingleEvent(of:with:)
,因此您不必自己实现它们。