我想获得前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,依此类推。