我目前正在尝试使用UITableView和Firebase数据库后端在我的应用程序中实施排行榜,我需要能够根据最高得分对数据进行排序,并显示用户名和得分。当前代码不会检索数据,而是使用已编码的可选默认值。
func retrieveScores(){
_ = Auth.auth().currentUser?.uid
let highScoreDB = Database.database().reference().child("Leaderboard").child("True False Quiz").queryOrdered(byChild: "High Score")
highScoreDB.observeSingleEvent(of: .value) { (snapshot) in
let value = snapshot.value as! Dictionary<String, Any>
print(value)
let userName = value["Name"] as? String ?? "error"
let highScore = value["High Score"] as? Int ?? 0
print(highScore)
let score = HighScore()
score.name = userName
score.score = highScore
self.scoreArray.append(score)
self.highScoreTableView.reloadData()
}
}
此功能可检索用户数据,然后将其传递到表视图可以访问数据的数组中。
控制台当前打印:
["ZybxNO7fQeMHEkc2CnCq74xsmus1": {
"High Score" = 9;
Name = ty;
}, "kLxqZteRfBeC0bNIkLCjrPukMGx1": {
"High Score" = 11;
Name = Sam;
}]
是从数据库中检索到的数据,但未附加此数据,并且该应用程序显示以下内容: App View
谢谢。
答案 0 :(得分:0)
您的value
的结构不同于您等待的结构。
似乎您的Firebase模型看起来像
{
<some_key>: {
"Name": String,
"High Score": Int
}
}
您现在正尝试获取刚刚获得的value
的“名称”,并且直到模型看起来像现在一样,您才能获得此名称。
首先,您必须为自己的key
获得价值,并何时获得您的“姓名”和“高分”。
答案 1 :(得分:0)
如果将查询结果作为值进行请求,则会获得一个快照,其中包含与查询匹配的所有节点。要访问每个节点,您需要遍历该快照的子节点:
highScoreDB.observeSingleEvent(of: .value) { (snapshot) in
for score in snapshot.children.allObjects as! [DataSnapshot] {
let value = score.value as! Dictionary<String, Any>
print(value)
let userName = value["Name"] as? String ?? "error"
let highScore = value["High Score"] as? Int ?? 0
print(highScore)
let score = HighScore()
score.name = userName
score.score = highScore
self.scoreArray.append(score)
}
self.highScoreTableView.reloadData()
}