2016-11-29 2 views
2

У меня есть эта функция, написанная на Swift, извлекающих в списке лидеров, а затем показывает его пользователю:Как правильно использовать 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) 

    } 

Проблема заключается в том, что, когда я принесу, он Гав мне следующий список:

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

Это показывает мне первые пять игроков, но затем он перечисляет их в алфавитном порядке. Поскольку это не большая проблема, я задаюсь вопросом, есть ли способ упорядочить их по значению.

Таковы правила:

{ 
    "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(), чтобы получить первые пять игроков и список их по пунктам, которые они набрали?

+0

Итак, во-первых - это плохой способ структурирования данных вашей базы данных, у вас должно быть имя узла, сгенерированное childByAutoId, с дочерними узлами имени: некоторое имя и оценка: некоторый балл. Затем вы можете запросить эти узлы и отсортировать по имени или счету и т. Д. Как бы то ни было, вы сортируете byValue, что именно вы получаете - B) en, G) abriela, I) vailo (B, G, I, PV) , – Jay

+0

Я знаю, что это плохо, если вы заметили, у меня есть узел пользователя, где они зарегистрированы с функцией childByAutoId. список, который я создал, - это просто играть с firebase. –

ответ

4

Когда вы запускаете запрос к Firebase, он возвращает ключи элементов, соответствующих вашему запросу, значение этих элементов и относительный порядок элементов в результате. Если вы слушаете событие .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, так что это не тестировалось и синтаксис не может быть совершенным

Смежные вопросы