Firebase获取地图对象数据

时间:2019-02-23 14:03:45

标签: swift firebase object google-cloud-firestore

我正在尝试检索我存储在Firebase中Map对象中的地址。

但是我似乎无法检索到任何数据,当我打印出结果时,它什么也不显示。

这是我的Firebase结构

Here is my Firebase Structure

这是我向Firebase发出的请求

let key = UserDefaults.standard.value(forKey: "uid") as? String ?? "Null"
        let docRef = firebaseDB.collection("user").document(key)
        docRef.getDocument { (document, error) in
            if let document = document, document.exists {
                let docData = document.data()

                let city = docData!["city"] as! String
                let country = docData!["country"] as! String
                let county = docData!["county"] as! String
                let lineOne = docData!["lineOne"] as! String
                let lineTwo = docData!["lineTwo"] as! String
                let postCode = docData!["postCode"] as! String

                print(city,country,county,lineOne,lineTwo,postCode)
            } else {
                print("Document does not exist")

            }

1 个答案:

答案 0 :(得分:0)

如果这崩溃了

let city = docData!["city"] as! String

它指示节点不包含“ city”的子代。也许它完全丢失了,或者是城市而不是城市。

强制展开可能为零的var(例如as!)实际上是在说“嘿var,您永远不会为零”,并且可能导致应用崩溃和不稳定。

处理此问题并保护您的代码的更好方法是在可能不是预期的情况下正确处理数据。

一种更好的方法是像这样使用nil合并,如果city为nil,则提供默认值

let city = data!["city"] as? String ?? "no city selected"

或者如果您想使用nil,则将读取子节点的方式更改为

let city = document.get("city")

请记住,尽管此代码不会崩溃,但在这种情况下城市 可能为零,因此您需要在该语句之后的代码中进行相应的处理。

您还可以使用if let语句

var aPlace = PlaceStruct()

if let city = document.get("city") as? String {
    aPlace.city = city
} else {
    aPlace.city = "Hometown"
}

或保护语句以保护您的数据。

在任何情况下,除非您知道它们将永远为零,否则不要强行解开可能为零的变量-妥善处理那些可能为零的变量。