使用 Firebase ios 获取数据

Posted

技术标签:

【中文标题】使用 Firebase ios 获取数据【英文标题】:Fetch data with 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 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。 【参考方案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,这行得通,但它还不是我想要的,即用户这个模型类用户来解析所有数据。

以上是关于使用 Firebase ios 获取数据的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Swift 5 (iOS) 从 Firebase 数据库中获取和打印单个值

iOS Firebase 获取值等于某物的数据

View Controller 显示黑屏而不是从 Firebase 数据库 Swift iOS 中获取用户

iOS Firebase 云消息传递在应用关闭时获取数据

通过在 iOS 中加入表从 Firebase 获取数据

如何按文档 ID 从 Firebase Firestore 获取数据 - iOS?