一尘不染

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

swift

我想获得前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个最高得分手的姓名和得分。

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


阅读 215

收藏
2020-07-07

共1个答案

一尘不染

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,依此类推。

2020-07-07