swift - 如何正确使用 queryOrderedByValue

标签 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;

它显示了前五名玩家,但随后按字母顺序列出了他们。由于这不是一个大问题,我想知道是否有一种方法可以按值(value)对它们进行排序。

规则如下:

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

数据库组织如下:

  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() 检索前五名球员并按他们得分列出他们?

最佳答案

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

但是,当您随后请求该快照的 value 属性时,将该快照打印为一个 block 时,数据将转换为字典。由于字典只能包含键和值,因此此时项目的顺序会丢失。事实证明,字典随后会打印出按其键排序的项目。

要按顺序排列项目,您应该使用 snapshot.children 迭代它们:

leaderboardDB.observeSingleEvent(of: .value, with: { (snapshot) in
    for child in snapshot.children {
        print(child.key)
    }
}, withCancel: nil)

另见:

关于swift - 如何正确使用 queryOrderedByValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40875531/

相关文章:

java - removeEventListener 不删除 firebase 中的监听器

ios-Xcode 10 : Razorpay pod "module compiled with Swift 4.1 cannot be imported by the Swift 4.2 compiler"

firebase - Google API 控制台 - 重新使用已删除的项目 ID

swift - 未从 firebase 数据库 swift 4 中获取数据

angularjs - 将 Firebase user.uid 设置为全局变量

javascript - 检查数组中的对象值是否已经存在于不同的对象数组中?

javascript - 如何在 javascript 中重构 firebase 数据

swift - 判断NSImageView是否高亮

ios - 如何存储 Firebase 数据以便在 Swift 中轻松快速地访问

ios - 解决 Swift 属性覆盖中的递归