【问题标题】:Fetch data with Firebase ios使用 Firebase ios 获取数据
【发布时间】:2016-12-25 22:36:36
【问题描述】:

我在 Android 中有一个应用程序,我正在构建它的 iOS 版本,但是当我尝试将用户数据提取到我的模型类中时出现错误,我知道这是因为某些节点里面没有所有键,但这在 Android 上没问题,我不知道如何在 Swift 3 上处理它。您可以在本文末尾的链接上查看我的数据。

我做了一个 .childadded:

致命错误:在展开可选值时意外发现 nil

这是我的模型类:

struct User {
var name: String
var age: String
var gender: String
var description: String
var hair:String
var skin:String
var tel:String

init(name: String, age: String, gender: String, hair: String, skin: String, tel: String, description: String) {
    self.name = name
    self.age = age
    self.gender = gender
    self.description = description
    self.hair = hair
    self.skin = skin
    self.tel = tel
}

init(snapShot: FIRDataSnapshot){
    self.name = (snapShot.value! as! NSDictionary)["name"] as! String
    self.age = (snapShot.value! as! NSDictionary)["age"] as! String
    self.gender = (snapShot.value! as! NSDictionary)["gender"] as! String
    self.description = (snapShot.value! as! NSDictionary)["description"] as! String
    self.hair = (snapShot.value! as! NSDictionary)["hair"] as! String
    self.skin = (snapShot.value! as! NSDictionary)["skin"] as! String
    self.tel = (snapShot.value! as! NSDictionary)["tel"] as! String

}

func toAnyObject() -> [String: Any]{
    return ["name": name, "age": age, "gender": gender, "description": description, "hair": hair, "skin": skin, "tel": tel]
}  
}

这是我的获取代码:

ref.child("users").observe(.childAdded, with: { (snapshot) in
      if(snapshot.value is NSNull){

        }else{
            let user = User(snapShot: snapshot)
            print("snapshot not nil: \(snapshot.key) \(snapshot.value)")
            print("user: \(user.name)")
        }

它会有一些数据是空的,比如皮肤和描述,明白吗?我有一些键较少的寄存器,在 android 中这没问题,但在 swift 上它无法处理 nil

第一个寄存器工作正常,但第二个崩溃 My data base

致命错误:在展开可选值时意外发现 nil 2016-12-21 14:13:46.765206 GPMap[6033:1579494] 致命错误:在展开可选值时意外发现 nil

【问题讨论】:

  • 您在问题中包含了指向 JSON 树图片的链接。请将其替换为作为文本的实际 JSON,您可以通过单击 your Firebase Database console 中的导出 JSON 链接轻松获得该文本。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

将您的函数更改为如下所示以检查值是否存在:

init(snapShot: FIRDataSnapshot){

     self.name = (snapshot.value as? NSDictionary)?["name"] as? String ?? ""

     // ... continue for other values

}

然后,您不需要检查值是否为 Null(因此没有错误):

ref.child("users").observe(.childAdded, with: { (snapshot) in

        let user = User(snapShot: snapshot)

        // use the method from User to parse the data
        let userData = user.toAnyObject()
        print(userData)    //Dictionary of data variables

        print("snapshot not nil: \(snapshot.key) \(snapshot.value)")
        print("user: \(user.name)")

    })

【讨论】:

  • 使用 let user = User(snapShot: snapshot) 的目的是在一行中解析所有信息,我将进行此测试。
  • Tks @Nathan-levitt,这行得通,但它还不是我想要的,即用户这个模型类用户来解析所有数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 2021-05-05
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多