Доступ к лучшим результатам из запроса к базе данных Firebase, используя Swift - PullRequest
0 голосов
/ 01 декабря 2018

Мне удалось отобразить пользователей и их оценки в моем tableView.Тем не менее, мне бы очень хотелось иметь доступ только к топ-50. К сожалению, то, как я сейчас храню свою базу данных, означает, что я сначала наблюдаю за «дочерними» пользователями.и я не могу использовать queryEnding, поскольку данные для имени пользователя извлекаются отдельно от рекорда, и оба затем добавляются в словарь.Пожалуйста, смотрите ниже .....

var userName = ""
var highScore = 0
var usernameHighScoreArray: [Int : String] = [:]

func retrieveUserData() {

    let ref = Database.database().reference().child("Users")

    ref.observeSingleEvent(of: .value, with: {
        (snapshot) in
        if let dataFB = snapshot.value as? Dictionary<String,AnyObject> {
            for(_, value) in dataFB {
                if let scoreData = value as? Dictionary<String,AnyObject> {

                    if let uname = scoreData["username"] as? String {
                        self.userName = uname
                        print("Username \(uname)")
                    }
                    if let hScore = scoreData["highScore"] as? Int {
                        self.highScore = hScore
                        print("HighScore \(hScore)")
                        self.usernameHighScoreArray[self.highScore] = self.userName
                    }
                }
            }
            self.topScoresTableView.reloadData()
        }
    })
}

Вот мой макет базы данных ...

https://imgur.com/LuEYFnb

Есть ли я в любом случае просто вытащить 50top highScores, на данный момент в таблице результатов отображается только список имен пользователей и их оценок в списке, который не находится в каком-либо определенном порядке.

Заранее спасибо

Редактировать: Ниже приведенокак структура моей базы данных выглядит с помощью текста

Пользователи

3vPyk7EIw4eTU8hUgRzCDiGGpV23

highScore: 839 имя пользователя: "Davve"

EkQWKDBuhdcghk2 *i2C2 * 10x6C2 * 10CZF2x6D6S6D6S1D6S6S1B6highScore: 1476 имя пользователя: "Qaz"

yDNHXJ8f7acFNdO6kOKseFPj7Zz1

highScore: 1479 имя пользователя: "Ijn"

1 Ответ

0 голосов
/ 02 декабря 2018

Я думаю, что вы хотите использовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...