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

时间:2018-07-28 01:57:42

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

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

This is my database structure

我需要将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()
            })

        }
    }

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

2 个答案:

答案 0 :(得分: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"])

            }
        }
    }

答案 1 :(得分:0)

蒂格伦的回答很好,但这是另一种选择。此代码遍历“用户”节点内的每个子节点,并寻找深层路径以获取名称。请注意,这会将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)
        }
    }
})

我感觉很快,所以如果您不想离开观察者,这是第三个变种。请注意,如果包含名称的节点不存在,则结果数组将在该索引处包含“ 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)
})