2016-11-29 211 views
2

我有这个功能写在斯威夫特是取排行榜,然后显示给用户:如何正确使用queryOrderedByValue

@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) 

    } 

的问题是,当我把它拿来,它gaves我下面的列表:

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()检索前五球员名单他们的得分是多少?

+0

因此,首先 - 这是构建Firebase数据的一种不好的方法,您应该有一个由childByAutoId生成的节点名称,其中包含名称的子节点:某个名称和分数:某个分数。然后你可以查询这些节点并按名称或分数排序等等。实际上,你正在按照你正在得到的值排序 - B)en,G)abriela,I)vailo(B,G,I,PV) 。 – Jay

+0

我知道这是一种糟糕的方式,如果你注意到,我有用户节点他们用childByAutoId函数注册。我生成的列表只是玩弄firebase。 –

回答

4

当你火力打击火力地堡查询,它将返回与您的查询匹配的项目的键,这些项目的值以及结果中项目的相对顺序。如果您聆听.Value事件,则所有这三个都会合并到一个FIRDataSnapshot中。

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

为了获得订单的项目,你应该重复使用他们在snapshot.children

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

另见:

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上打字,所以它没有经过测试和语法可能不是完美的