gpt4 book ai didi

swift - 处理来自 firebase 的 Null ref

转载 作者:行者123 更新时间:2023-11-28 11:37:29 24 4
gpt4 key购买 nike

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

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

最佳答案

因为您已经使用 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 }

据推测,上面的内容会在一个捕获错误的 flatMap 中......

最后,您应该考虑使用 RxFirebase

关于swift - 处理来自 firebase 的 Null ref,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54672288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com