尝试使用Firebase后端创建排行榜并对数据进行排序无法正确检索数据(Swift 4.2)

时间:2018-12-03 15:13:13

标签: ios swift firebase firebase-realtime-database uikit

我目前正在尝试使用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;
}]

是从数据库中检索到的数据,但未附加此数据,并且该应用程序显示以下内容: App View

谢谢。

2 个答案:

答案 0 :(得分:0)

您的value的结构不同于您等待的结构。 似乎您的Firebase模型看起来像

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

您现在正尝试获取刚刚获得的value的“名称”,并且直到模型看起来像现在一样,您才能获得此名称。 首先,您必须为自己的key获得价值,并何时获得您的“姓名”和“高分”。

答案 1 :(得分:0)

如果将查询结果作为值进行请求,则会获得一个快照,其中包含与查询匹配的所有节点。要访问每个节点,您需要遍历该快照的子节点:

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()
}