【问题标题】:How to get values inside nested keys in Firebase on Swift如何在 Swift 上的 Firebase 中获取嵌套键中的值
【发布时间】: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()
            })

        }
    }

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

【问题讨论】:

    标签: ios swift uitableview firebase firebase-realtime-database


    【解决方案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)
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-29
      • 2021-12-14
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 2018-04-01
      相关资源
      最近更新 更多