我想获得前10名用户的最高游戏分数并将其显示在表格视图中。
leaderboards
CQVudhI2OjTfNbqWOWi2T1DTWKw2
HIGH-SCORE: 23
PLAYER-NAME: Russell
REACTION-TIME: .9
SWIPES: 12
F9IbjpVSE8g5YN3PX0sdhSNGULJ3
HIGH-SCORE: 29
PLAYER-NAME: Clayton
REACTION-TIME: .87
SWIPES: 22
HDIHCUSJDHCJHZKSHJXH
HIGH-SCORE: 89
PLAYER-NAME: Damien
REACTION-TIME: .77
SWIPES: 32
jdhsjdbwkjsdkahnkdnk232j3j2
HIGH-SCORE: 43
PLAYER-NAME: Christopher
REACTION-TIME: .99
SWIPES: 32
在表格视图中,我希望显示10个最高得分手的姓名和得分。
任何帮助,将不胜感激。谢谢
Firebase不提供任何通过查询来逆转排序顺序的方法。但是,如果你将分数存储为负值,则超级简单。
这是一个结构
scores
score_0
amt: -20
score_1
amt: -10
score_2
amt: -12
score_3
amt: -1
score_4
amt: -22
然后是读取前三个“最高”分数22的代码,然后是20和12
let scoresRef = self.ref.child("scores")
let queryRef = scoresRef.queryOrdered(byChild: "amt").queryLimited(toFirst: 3)
queryRef.observeSingleEvent(of: .value, with: { snapshot in
for child in snapshot.children {
let snap = child as! DataSnapshot
print(snap.value)
}
})
和输出
Optional({
amt = "-22";
})
Optional({
amt = "-20";
})
Optional({
amt = "-12";
})
当然,如果分数数量有限,也可以将它们读入数组并进行排序。
为了完整起见,如果你不想将分数存储为负值,请按以下步骤操作。
let scoresRef = self.ref.child("scores")
let queryRef = scoresRef.queryOrdered(byChild: "amt").queryLimited(toLast: 3)
queryRef.observeSingleEvent(of: .value, with: { snapshot in
var scoresArray = [Int]()
for child in snapshot.children {
let snap = child as! DataSnapshot
let score = snap.childSnapshot(forPath: "amt")
scoresArray.append(score.value as! Int)
}
scoresArray = scoresArray.reversed()
print(scoresArray)
})
上面的代码通过queryLimited(toLast)读取三个最高值,分别是12、20和22,并填充了一个数组。该数组可以颠倒顺序,以降序排列22、20和12。
最后一个选择是将它们读为12、22、20,但将每个amt插入位置0的数组中。因此12将位于索引0,然后22将位于索引0,12将位于索引1,依此类推。
感谢大家的帮助!我要做的是执行querylimted(前10个),这是我得到10个最高分,然后将其添加到数组中并反转了它。那被认为足够好吗?
@russsellphillips如果它有效,稳定并且易于维护,那么绝对可以,它足够好!如果我的回答有帮助,请接受它,这样也可以帮助其他人!