2016-11-29 4 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; 

最初の5人のプレイヤーが表示されますが、アルファベット順に表示されます。これは大きな問題ではないので、値で注文する方法があるのだろうかと思います。

これらはルールです:

{ 
    "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 

をだから、私の質問が適切に最初の5人の選手とリストを取得するためにqueryOrderedByValue()を使用する方法であります彼らは得点でポイントを獲得しましたか?

+0

だから最初に消火器のデータを構造化するのは悪い方法ですが、childByAutoIdによって生成されたノード名を持つ必要があります。これらのノードを照会して、名前やスコアなどで並べ替えることができます。そのまま、あなたが得ている値であるByValをソートしています - B)en、G)abriela、I)vailo(B、G、I、PV) 。 – Jay

+0

私はそれが悪い方法だと知っていれば、私はあなたがchildByAutoId funcで登録されているユーザーノードを持っています。私が生成したリストはfirebaseで遊んでいるだけです。 –

答えて

4

完璧ではないかもしれないので、私のiPadで入力しますクエリに一致するアイテムのキー、それらのアイテムの値、および結果内のアイテムの相対的な順序を返します。 .Valueイベントをリスンすると、これらの3つのイベントはすべて1つのFIRDataSnapshotに結合されます。

valueそのスナップショットまたはのスナップショットを1ブロックとして印刷するかどうかを尋ねると、データは辞書に変換されます。ディクショナリにはキーと値しか含めることができないので、アイテムの順序はその時点で失われます。それが判明すると、辞書はそのキーで注文されたアイテムを印刷します。順番にアイテムを取得するには、あなたが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) 

    } 

*それはテストされていないとあなたがFirebaseに対してクエリを発射する場合の構文は、