我设法在tableView中显示用户及其分数。但是,我真的很希望只能访问前50名。不幸的是,我当前存储数据库的方式意味着我首先观察到Users是“ child”。而且我不能使用queryEnding,因为用户名的数据与高分分开获取,然后都添加到字典中。请看下面.....
var userName = ""
var highScore = 0
var usernameHighScoreArray: [Int : String] = [:]
func retrieveUserData() {
let ref = Database.database().reference().child("Users")
ref.observeSingleEvent(of: .value, with: {
(snapshot) in
if let dataFB = snapshot.value as? Dictionary<String,AnyObject> {
for(_, value) in dataFB {
if let scoreData = value as? Dictionary<String,AnyObject> {
if let uname = scoreData["username"] as? String {
self.userName = uname
print("Username \(uname)")
}
if let hScore = scoreData["highScore"] as? Int {
self.highScore = hScore
print("HighScore \(hScore)")
self.usernameHighScoreArray[self.highScore] = self.userName
}
}
}
self.topScoresTableView.reloadData()
}
})
}
这是我的数据库布局...
无论如何,我只需要拔出50个最高的highScores,此刻,成绩表就只显示用户名列表和他们的得分,而列表的排列顺序不是特定的。
预先感谢
编辑:以下是我的数据库结构通过文本显示的样子
用户
3vPyk7EIw4eTU8hUgRzCDiGGpV23
高分:839 用户名:“ Davve”
EkQWKDBuhdcghk1F6ZC0XlvDiNs2
高分:1476 用户名:“ Qaz”
yDNHXJ8f7acFNdO6kOKseFPj7Zz1
高分:1479 用户名:“ Ijn”
答案 0 :(得分:1)
我认为您想使用queryLimited(toLast:x),然后将结果插入数组位置0以反转顺序?让我尝试这个答案,看看它是否适合您的问题;假设我们想要两个最高分数:
给出结构
Users
uid_0
highScore: 1171
username: "Qaz"
uid_1
highScore: 1170
username: "Trony"
uid_2
highScore: 672
username: "Balls"
uid_3
highScore: 1172
username: "Sam"
因此,两个最高分是Sam(1172)和Qaz(1171)。
这里的想法是让Firebase对得分进行排序,该得分将升序(从低到高),然后选择最后2个得分,即两个最高得分。
让我们从一个用于存储每个名称和分数的类开始-我们将其用作tableView的数据源。
class ScoreClass {
var name = ""
var score = 0
init(withName: String, andScore: Int) {
self.name = withName
self.score = andScore
}
}
然后是一个数组,用于存储ScoreClass的位置
var scoresArray = [ScoreClass]()
,然后使用代码查询Firebase。我们按高分对结果进行排序,只想要最后两个,即Sam和Qaz
let postsRef = self.ref.child("users")
let query = postsRef.queryOrdered(byChild: "highscore").queryLimited(toLast: 2)
query.observeSingleEvent(of: .value, with: { snapshot in
for child in snapshot.children {
let snap = child as! DataSnapshot
let dict = snap.value as! [String: Any]
let name = dict["Name"] as! String
let score = dict["highscore"] as! Int
let aScore = ScoreClass(withName: name, andScore: score)
scoresArray.insert(aScore, at: 0)
}
for s in scoresArray { //print them to console
print(s.score, s.name)
}
})
结果是
1172 Sam
1171 Qaz
请注意,当我们遍历快照时,会将其插入数组位置0,这意味着读入的最后一个分数(最高1117)将是数组0位置的“顶部”。