我用 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;
它显示了前五名玩家,但随后按字母顺序列出了他们。由于这不是一个大问题,我想知道是否有一种方法可以按值(value)对它们进行排序。
规则如下:
{
"rules": {
".read": "auth != null",
".write": "auth != null",
"scores": {
".indexOn": ".value"
}
}
}
数据库组织如下:
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()
检索前五名球员并按他们得分列出他们?
最佳答案
当您针对 Firebase 发出查询时,它会返回与您的查询匹配的项的键、这些项的值以及项在结果中的相对顺序。如果您监听 .Value 事件,所有这三个事件将合并到一个 FIRDataSnapshot 中。
但是,当您随后请求该快照的 value
属性时,或将该快照打印为一个 block 时,数据将转换为字典。由于字典只能包含键和值,因此此时项目的顺序会丢失。事实证明,字典随后会打印出按其键排序的项目。
要按顺序排列项目,您应该使用 snapshot.children
迭代它们:
leaderboardDB.observeSingleEvent(of: .value, with: { (snapshot) in
for child in snapshot.children {
print(child.key)
}
}, withCancel: nil)
另见:
关于swift - 如何正确使用 queryOrderedByValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40875531/