Попытка создать таблицу лидеров с помощью бэкэнда Firebase и сортировки данных не приводит к правильному извлечению данных (Swift 4.2) - PullRequest
0 голосов
/ 03 декабря 2018

В настоящее время я пытаюсь реализовать таблицу лидеров в своем приложении, используя UITableView и серверную часть базы данных Firebase, мне нужно иметь возможность сортировать данные в соответствии с наивысшим баллом и отображать имя пользователя и балл соответственно.Текущий код не извлекает данные и использует необязательные значения по умолчанию, которые закодированы.

func retrieveScores(){
    _ = Auth.auth().currentUser?.uid
    let highScoreDB = Database.database().reference().child("Leaderboard").child("True False Quiz").queryOrdered(byChild: "High Score")

    highScoreDB.observeSingleEvent(of: .value) { (snapshot) in
        let value = snapshot.value as! Dictionary<String, Any>
        print(value)

        let userName = value["Name"] as? String ?? "error"
        let highScore = value["High Score"] as? Int ?? 0
        print(highScore)

        let score = HighScore()
        score.name = userName
        score.score = highScore

        self.scoreArray.append(score)
        self.highScoreTableView.reloadData()
    }
}

Это функция, которая извлекает пользовательские данные и затем передает их в массив, где табличное представление может получить доступ к данным..

Консоль в настоящее время печатает:

["ZybxNO7fQeMHEkc2CnCq74xsmus1": {
"High Score" = 9;
Name = ty;
}, "kLxqZteRfBeC0bNIkLCjrPukMGx1": {
    "High Score" = 11;
    Name = Sam;
}]

, которая представляет собой данные, извлекаемые из базы данных, но эти данные не добавляются, и приложение отображает следующее: Вид приложения

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

Ответы [ 2 ]

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

Если вы запросите результат запроса в качестве значения, вы получите один снимок, который имеет все узлы, соответствующие вашему запросу.Чтобы добраться до каждого отдельного узла, вам нужно перебрать потомки этого снимка:

highScoreDB.observeSingleEvent(of: .value) { (snapshot) in
  for score in snapshot.children.allObjects as! [DataSnapshot] {
    let value = score.value as! Dictionary<String, Any>
    print(value)

    let userName = value["Name"] as? String ?? "error"
    let highScore = value["High Score"] as? Int ?? 0
    print(highScore)

    let score = HighScore()
    score.name = userName
    score.score = highScore

    self.scoreArray.append(score)
  }
  self.highScoreTableView.reloadData()
}
0 голосов
/ 03 декабря 2018

Ваш value имеет другую структуру, чем вы ожидаете.Похоже, ваша модель Firebase выглядит как

{
 <some_key>: {
         "Name": String,
         "High Score": Int
      }
}

Вы пытаетесь получить «Имя» из value, который вы только что получили, и вы не достигнете этого, пока ваша модель не будет выглядеть сейчас.Во-первых, вы должны получить значение для ваших key и THEN , чтобы получить ваши "Имя" и "Рекорд".

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