我希望前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名得分手的名字和得分。
任何帮助将不胜感激。感谢
答案 0 :(得分:2)
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处等
答案 1 :(得分:0)
我认为你必须首先将所有Databae加载到一个结构数组中,将数组过滤到新数组中(如何执行此操作,检查here)并将其表示在tableView上。顺便说一句,如果您只是从Firebase开始,我强烈建议您阅读this教程。我希望我的答案很有用:)
答案 2 :(得分:0)
这是另一种方法,您可以保存一些代码。从firebase检索时,不要使用append,而使用insert(newObject,at:0)。
在代码中您可以自己替换:
scoresArray.append()
为
scoresArray.insert( score, at: 0)
完整代码:
var scoresArray = [Int]()
let scoresRef = self.ref.child("leaderboards")
let queryRef = scoresRef.queryOrdered(byChild: "HIGH-SCORE").queryLimited(toLast: 10)
queryRef.observeSingleEvent(of: .value, with: { snapshot in
for child in snapshot.children {
let snap = child as! DataSnapshot
let score = snap.childSnapshot(forPath: "HIGH-SCORE").value as! Int
scoresArray.insert( score, at: 0)
}
})
最初我从这里得到这个答案: https://www.youtube.com/watch?v=4y_NLkYT6NU