如何正确使用queryOrderedByValue

时间:2016-11-29 20:50:24

标签: swift firebase firebase-realtime-database

我在Swift中编写了这个函数,用于获取排行榜,然后将其显示给用户:

@IBAction func onShowLeaderboardTapped(_ sender: Any) {
        let leaderboardDB = FIRDatabase.database().reference().child("scores").queryOrderedByValue().queryLimited(toLast: 5)

        leaderboardDB.observeSingleEvent(of: .value, with: { (snapshot) in
            print("leaderboard snapshot:" ,snapshot)
        }, withCancel: nil)

    }

问题在于,当我拿到它时,它会给我以下列表:

 Ben = 9;
 Gabriela = 12;
 Ivailo = 7;
 Petar = 10;
 Vania = 10;

它显示了前五个玩家,但随后按字母顺序排列。由于这不是一个大问题,我想知道是否有办法按价值订购它们。

这些是规则:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
      "scores": {
      ".indexOn": ".value"
    }
  }
}

DB的组织如下:

  matchrooms:
  users: 
  scores:
>      Ben: 9
>      Dimitar: 7
>      Gabriela: 12
>      Ishest: 6
>      Ivailo: 7
>      Ivan: 5
>      Marina: 3
>      Pesho: 3
>      Petar: 10
>      Rosen: 6
>      Vania: 10
>      Yasen: 2

所以,我的问题是如何正确使用queryOrderedByValue()检索前五名球员并按他们得分的分数列出?

2 个答案:

答案 0 :(得分:5)

当您针对Firebase触发查询时,它会返回与您的查询匹配的项的键,这些项的值以及结果中项的相对顺序。如果您收听.Value事件,则所有这三个事件将合并为一个FIRDataSnapshot。

但是当您要求该快照的<{1}}属性将该快照打印为一个块时,数据将转换为字典。由于字典只能包含键和值,因此在该点丢失了项目的顺序。事实证明,字典然后打印按键排序的项目。

要按顺序获取项目,您应该使用value

进行迭代
snapshot.children

另见:

答案 1 :(得分:0)

更改结构

scores
  -YUijia099sma
    name: "Ben"
    score: 9
  -Yij9a9jsddd
    name: "Dimitar"
    score: 7

然后

@IBAction func onShowLeaderboardTapped(_ sender: Any) {
        let leaderboardDB = FIRDatabase.database().reference().child("scores")
                           .queryOrdered(byChild: "score")
                           .queryLimited(toLast: 5)

        leaderboardDB.observeSingleEvent(of: .value, with: { (snapshot) in
            print("leaderboard snapshot:" ,snapshot)
        }, withCancel: nil)

    }

*在我的iPad上打字,因此未经过测试,语法可能不完美