使用Swift从Firebase数据库查询中访问最高得分

时间:2018-12-01 15:55:25

标签: ios swift firebase

我设法在tableView中显示用户及其分数。但是,我真的很希望只能访问前50名。不幸的是,我当前存储数据库的方式意味着我首先观察到Users是“ child”。而且我不能使用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

无论如何,我只需要拔出50个最高的highScores,此刻,成绩表就只显示用户名列表和他们的得分,而列表的排列顺序不是特定的。

预先感谢

编辑:以下是我的数据库结构通过文本显示的样子

用户

3vPyk7EIw4eTU8hUgRzCDiGGpV23

高分:839 用户名:“ Davve”

EkQWKDBuhdcghk1F6ZC0XlvDiNs2

高分:1476 用户名:“ Qaz”

yDNHXJ8f7acFNdO6kOKseFPj7Zz1

高分:1479 用户名:“ Ijn”

1 个答案:

答案 0 :(得分:1)

我认为您想使用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"

因此,两个最高分是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。我们按高分对结果进行排序,只想要最后两个,即Sam和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,这意味着读入的最后一个分数(最高1117)将是数组0位置的“顶部”。