【问题标题】:How to get data from firebase in descending order of value?如何按价值降序从firebase获取数据?
【发布时间】:2017-12-21 14:48:13
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    我认为您必须首先将所有 Databae 加载到一个结构数组中,将您的数组过滤到新数组中(如何做到这一点,检查here),然后在 tableView 上表示它。顺便说一句,如果您只是从 Firebase 开始,我强烈建议您阅读 this 教程。希望我的回答有用:)

    【讨论】:

      【解决方案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等等

      【讨论】:

      • 感谢大家的帮助!我所做的是做一个 querylimted(tolast 10) 这是我得到的 10 个最高分数,然后将它添加到一个数组并反转它。这被认为是足够好的代码吗?
      • @russsellphillips 如果它有效,稳定且易于维护,那么绝对是的,它已经足够好了!如果我的回答有帮助,请采纳,这样也能帮助到其他人!
      【解决方案3】:

      这是另一种方法,您可以节省一些代码。从 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

      【讨论】:

        猜你喜欢
        • 2019-11-26
        • 1970-01-01
        • 1970-01-01
        • 2017-03-03
        • 2019-06-16
        • 2017-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多