我正在尝试在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()
})
}
}
答案 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)
})