我有一个使用Firebase和RxSwift的应用程序。我从一个裁判那里得到快照,我现在遇到的问题是这个引用可能是空的,也就是说它不存在。如何使代码仍然通过传递空原因来运行?
如果没有,我应该打电话给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可能为空。
发布于 2019-02-13 16:53:29
由于您已经在用Observable.create()创建一个可观察的observer.onCompleted(),所以只需在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
发布于 2019-02-13 14:25:12
https://stackoverflow.com/questions/54672288
复制相似问题