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等等