如何以值的降序从firebase获取数据?

时间:2017-07-17 07:05:02

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

我希望前10名用户获得高分,并在桌面视图中显示。

leaderboards
 CQVudhI2OjTfNbqWOWi2T1DTWKw2
 HIGH-SCORE: 23
 PLAYER-NAME: Russell
 REACTION-TIME: .9
 SWIPES: 12

 F9IbjpVSE8g5YN3PX0sdhSNGULJ3
 HIGH-SCORE: 29
 PLAYER-NAME: Clayton
 REACTION-TIME: .87
 SWIPES: 22

 HDIHCUSJDHCJHZKSHJXH
 HIGH-SCORE: 89
 PLAYER-NAME: Damien
 REACTION-TIME: .77
 SWIPES: 32

 jdhsjdbwkjsdkahnkdnk232j3j2
 HIGH-SCORE: 43
 PLAYER-NAME: Christopher
 REACTION-TIME: .99
 SWIPES: 32

在表格视图中,我希望显示10名得分手的名字和得分。

任何帮助将不胜感激。感谢

3 个答案:

答案 0 :(得分:2)

Firebase无法通过查询撤消排序顺序。但是,如果您将分数存储为负值,那么这非常容易。

这是一个结构

scores
  score_0
     amt: -20
  score_1
     amt: -10
  score_2
     amt: -12
  score_3
     amt: -1
  score_4
     amt: -22

然后是读取前三名“高”分数22,然后是20和12

的代码
    let scoresRef = self.ref.child("scores")
    let queryRef = scoresRef.queryOrdered(byChild: "amt").queryLimited(toFirst: 3)

    queryRef.observeSingleEvent(of: .value, with: { snapshot in   
        for child in snapshot.children {
            let snap = child as! DataSnapshot
            print(snap.value)
        }
    })

和输出

Optional({
    amt = "-22";
})
Optional({
    amt = "-20";
})
Optional({
    amt = "-12";
})

当然,如果分数有限,可以将它们读入数组并进行排序。

为了完整性,如果您不想将分数存储为负值,请按照以下方式进行操作。

    let scoresRef = self.ref.child("scores")
    let queryRef = scoresRef.queryOrdered(byChild: "amt").queryLimited(toLast: 3)

    queryRef.observeSingleEvent(of: .value, with: { snapshot in

        var scoresArray = [Int]()

        for child in snapshot.children {
            let snap = child as! DataSnapshot
            let score = snap.childSnapshot(forPath: "amt")
            scoresArray.append(score.value as! Int)
        }

        scoresArray = scoresArray.reversed()
        print(scoresArray)
    })

上面的代码通过queryLimited(toLast)读取三个最高值,即12,20和22并填充数组。阵列可以反转,对22,20和12进行排序。

最后一个选项是以12,22,20读取它们,但是将每个amt插入到位置0的数组中。所以12将在索引0处,然后22将在索引0处且12将在索引1处等

答案 1 :(得分:0)

我认为你必须首先将所有Databae加载到一个结构数组中,将数组过滤到新数组中(如何执行此操作,检查here)并将其表示在tableView上。顺便说一句,如果您只是从Firebase开始,我强烈建议您阅读this教程。我希望我的答案很有用:)

答案 2 :(得分:0)

这是另一种方法,您可以保存一些代码。从firebase检索时,不要使用append,而使用insert(newObject,at:0)。

在代码中您可以自己替换:

scoresArray.append()

scoresArray.insert( score, at: 0)

完整代码:

var scoresArray = [Int]()
let scoresRef = self.ref.child("leaderboards")
let queryRef = scoresRef.queryOrdered(byChild: "HIGH-SCORE").queryLimited(toLast: 10)

queryRef.observeSingleEvent(of: .value, with: { snapshot in
  
  for child in snapshot.children {
    let snap = child as! DataSnapshot
    let score = snap.childSnapshot(forPath: "HIGH-SCORE").value as! Int
    scoresArray.insert( score, at: 0)
  }

})

最初我从这里得到这个答案: https://www.youtube.com/watch?v=4y_NLkYT6NU