Я думаю, что вы хотите использовать queryLimited (toLast: x) и затем вставить результаты в позицию массива 0, чтобы инвертировать порядок?Позвольте мне попробовать этот ответ и посмотреть, работает ли он на ваш вопрос;предположим, что мы хотим получить два наивысших результата:
При заданной структуре
Users
uid_0
highScore: 1171
username: "Qaz"
uid_1
highScore: 1170
username: "Trony"
uid_2
highScore: 672
username: "Balls"
uid_3
highScore: 1172
username: "Sam"
Итак, двумя высокими показателями являются Сэм с 1172 и Qaz с 1171.
Идея в том, чтопозвольте Firebase упорядочить результаты, которые будут возрастать (от низкого до высокого), а затем выбрать последние 2, которые будут двумя высокими показателями.
Давайте начнем с класса для хранения каждого имени и оценки - мыбудем использовать это как источник данных для нашего tableView.
class ScoreClass {
var name = ""
var score = 0
init(withName: String, andScore: Int) {
self.name = withName
self.score = andScore
}
}
, затем массив для хранения ScoreClass в
var scoresArray = [ScoreClass]()
и затем код для запроса Firebase.Мы упорядочиваем результаты по рекорду и хотим только последние два, которые будут Сэм и Qaz
let postsRef = self.ref.child("users")
let query = postsRef.queryOrdered(byChild: "highscore").queryLimited(toLast: 2)
query.observeSingleEvent(of: .value, with: { snapshot in
for child in snapshot.children {
let snap = child as! DataSnapshot
let dict = snap.value as! [String: Any]
let name = dict["Name"] as! String
let score = dict["highscore"] as! Int
let aScore = ScoreClass(withName: name, andScore: score)
scoresArray.insert(aScore, at: 0)
}
for s in scoresArray { //print them to console
print(s.score, s.name)
}
})
, и результат будет
1172 Sam
1171 Qaz
Обратите внимание, что, поскольку мы перебираем снимокмы вставляем их в позицию массива 0, что означает, что последний считанный результат (самый высокий, 1172) будет «вершиной» массива в позиции 0.