首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从火场处理空参

从火场处理空参
EN

Stack Overflow用户
提问于 2019-02-13 14:15:26
回答 2查看 117关注 0票数 0

我有一个使用Firebase和RxSwift的应用程序。我从一个裁判那里得到快照,我现在遇到的问题是这个引用可能是空的,也就是说它不存在。如何使代码仍然通过传递空原因来运行?

如果没有,我应该打电话给onCompleted。

代码语言:javascript
复制
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可能为空。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-13 16:53:29

由于您已经在用Observable.create()创建一个可观察的observer.onCompleted(),所以只需在else子句中调用observer.onCompleted()即可。

尽管如此,在我看来,您应该发出您创建的Trip()对象,然后将其保存在此函数之外。

更多信息:

对于你正在做的事情,你会期待更像这样的事情:

代码语言:javascript
复制
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() }
    }
}

请注意,上面的是一个自由函数;它不在任何类中。

为了充分实现您所拥有的代码,可以这样使用它:

代码语言:javascript
复制
refreshActiveTrip(getCurrentTrip(), championId: getChampion()!.id!)
    .do(onNext: { [weak self] trip in self?.saveCurrentTrip(trip) })
    .filter { $0.id != nil }

大概,上面的内容会出现在捕获错误的flatMap中.

最后,您应该考虑使用RxFirebase

票数 2
EN

Stack Overflow用户

发布于 2019-02-13 14:25:12

你可以用守卫让来防止这种零状态。

看看这个,

用警卫而不是如果?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54672288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档