如何在 Swift 上的 Firebase 中获取嵌套键中的值

Posted

技术标签:

【中文标题】如何在 Swift 上的 Firebase 中获取嵌套键中的值【英文标题】:How to get values inside nested keys in Firebase on Swift 【发布时间】:2018-07-28 01:57:41 【问题描述】:

我正在尝试在 Firebase 中的两个嵌套键中获取值。

:

我需要将 name 的所有值放入一个数组中。这是我仅访问节点“用户”的代码。我在想我可以一个接一个地使用“queryOrderedByKey”,但在这种情况下,xCode 崩溃并说不允许多个查询。

        Database.database().reference().child("user").queryOrderedByKey().observe(.childAdded)  (snapshot) in

        if snapshot.value != nil 

            let result = snapshot.value as! [String : AnyObject]

            if let name = result["name"] as? String 
                self.myArray.append(name)
            

            DispatchQueue.main.async(execute: 
                self.tableView.reloadData()
            )

        
    

这就是我在打印结果时得到的。

【问题讨论】:

【参考方案1】:

这就是答案

        Database.database().reference().child("user").observe(.childAdded)  (snapshot) in

        if let dictinoary = snapshot.value as? [String: Any] 
            if let myFinalStep = dictinoary["GeneralInformation"] as? [String: Any] 
                print(myFinalStep["name"])

            
        
    

【讨论】:

此代码将遍历 /users 节点中的每个用户,并在 /user 节点上留下一个观察者,因此如果添加任何用户,此代码将向应用程序发送一个事件。目前尚不清楚这是否是预期的结果,因为最初的问题似乎倾向于根据需要进行;如果是这样,请参阅我的答案。【参考方案2】:

Tigran 的答案非常好,但这里有一个替代方案。此代码遍历“用户”节点中的每个子节点,并查看深层路径以获取名称。请注意,这会为用户节点留下一个 childAdded 观察者,因此如果添加了任何其他节点,它将再次触发。

let usersRef = self.ref.child("user")
usersRef.observe(.childAdded, with:  snapshot in
    if let name = snapshot.childSnapshot(forPath: "GeneralInformation")
                          .childSnapshot(forPath: "name").value as? String 
        print(name)
    
)

如果您想一次性阅读名称而不留下观察者,这里有一个替代方案

let usersRef = self.ref.child("user")
usersRef.observeSingleEvent(of: .value, with:  snapshot in
    for child in snapshot.children 
        let snap = child as! DataSnapshot
        if let name = snap.childSnapshot(forPath: "GeneralInformation")
                          .childSnapshot(forPath: "name").value as? String 
            print(name)
        
    
)

我感觉 Swifty,所以如果你不想留下观察者,这里有第三种变体。请注意,如果包含该名称的节点不存在,则结果数组将在该索引处包含“No Name”。

let usersRef = self.ref.child("uses")
usersRef.observeSingleEvent(of: .value, with:  snapshot in
    let myUsers = snapshot.children.allObjects.map  $0 as! DataSnapshot 
    let names = myUsers.map  $0.childSnapshot(forPath: "GeneralInformation")
                                .childSnapshot(forPath: "name")
                                .value as? String ?? "No Name" 
    print(names)
)

【讨论】:

以上是关于如何在 Swift 上的 Firebase 中获取嵌套键中的值的主要内容,如果未能解决你的问题,请参考以下文章

如何从fireBase推送通知swift 4中获取数据

Swift 3.0,Firebase:如何获取最后添加的记录

如何在 Swift 的 Firebase Firestore 中获取当前文档 ID?

使用 Swift 3 调试 Firebase

Swift 和 Firebase 实时数据库:如何获取对象的数量?

如何通过在 swift 中实现观察者从 Firebase 实时数据库中获取嵌套数据