我在Swift中编写了这个函数,用于获取排行榜,然后将其显示给用户:
@IBAction func onShowLeaderboardTapped(_ sender: Any) {
let leaderboardDB = FIRDatabase.database().reference().child("scores").queryOrderedByValue().queryLimited(toLast: 5)
leaderboardDB.observeSingleEvent(of: .value, with: { (snapshot) in
print("leaderboard snapshot:" ,snapshot)
}, withCancel: nil)
}
问题在于,当我拿到它时,它会给我以下列表:
Ben = 9;
Gabriela = 12;
Ivailo = 7;
Petar = 10;
Vania = 10;
它显示了前五个玩家,但随后按字母顺序排列。由于这不是一个大问题,我想知道是否有办法按价值订购它们。
这些是规则:
{
"rules": {
".read": "auth != null",
".write": "auth != null",
"scores": {
".indexOn": ".value"
}
}
}
DB的组织如下:
matchrooms:
users:
scores:
> Ben: 9
> Dimitar: 7
> Gabriela: 12
> Ishest: 6
> Ivailo: 7
> Ivan: 5
> Marina: 3
> Pesho: 3
> Petar: 10
> Rosen: 6
> Vania: 10
> Yasen: 2
所以,我的问题是如何正确使用queryOrderedByValue()
检索前五名球员并按他们得分的分数列出?
答案 0 :(得分:5)
当您针对Firebase触发查询时,它会返回与您的查询匹配的项的键,这些项的值以及结果中项的相对顺序。如果您收听.Value事件,则所有这三个事件将合并为一个FIRDataSnapshot。
但是当您要求该快照的<{1}}属性或将该快照打印为一个块时,数据将转换为字典。由于字典只能包含键和值,因此在该点丢失了项目的顺序。事实证明,字典然后打印按键排序的项目。
要按顺序获取项目,您应该使用value
:
snapshot.children
另见:
答案 1 :(得分:0)
更改结构
scores
-YUijia099sma
name: "Ben"
score: 9
-Yij9a9jsddd
name: "Dimitar"
score: 7
然后
@IBAction func onShowLeaderboardTapped(_ sender: Any) {
let leaderboardDB = FIRDatabase.database().reference().child("scores")
.queryOrdered(byChild: "score")
.queryLimited(toLast: 5)
leaderboardDB.observeSingleEvent(of: .value, with: { (snapshot) in
print("leaderboard snapshot:" ,snapshot)
}, withCancel: nil)
}
*在我的iPad上打字,因此未经过测试,语法可能不完美