Firebase - получение списка данных по порядку (сначала последние данные) - PullRequest
0 голосов
/ 28 сентября 2019

Я работаю над приложением чата.Я хочу получить последние 20 сообщений из базы данных Firebase и по порядку, сообщение было добавлено.Например, если я отправил 3 разных сообщения «Привет», «Что случилось», «Пока».Я должен получить «Привет», «Что случилось», «Пока» в том же порядке.

Я использую следующий запрос.

ref.child(Constants.messageListKey).child("-Laray524a9Na-C7zdij").queryLimited(toLast: Constants.messageLimitPerCall).observeSingleEvent(of: .value, with: { (snapshot) in 
       let currentUserChatList = snapshot.value as? NSDictionary
       if let chatList = currentUserChatList?.allKeys { 
         // parsing the data here
       }
}

Я даже пытался использовать .queryOrderedByKey()и .queryOrdered(byChild:) но все тот же результат.

Результат, который я получаю, не в порядке.Например, я получаю "Что случилось", "Привет", "Пока".Результат даже не в порядке возрастания, ни в порядке убывания.Это просто случайный порядок.

Схема, которую я использую, выглядит следующим образом:

-chatList
    -autogeneratedKey
         -msg = "Some Message"

Есть ли что-то, чего мне не хватает?Если есть какие-либо детали, которые я пропустил, пожалуйста, дайте мне знать, чтобы лучше понять мой вопрос.

1 Ответ

2 голосов
/ 28 сентября 2019

Я бы предложил добавить к вам метку времени, которая будет гарантировать заказ.Затем вы также добавили бы отрицательную отметку времени, которая включала бы сортировку по убыванию

messages
   msg_0
     msg: "What's up"
     timestamp: 20190927013000
     neg_timestamp: -20190927013000
   msg_1
     msg: "Hi"
     timestamp: 20190927020000
     neg_timestamp: -20190927020000

Затем вы можете запросить, но отметку времени для возрастания и neg_timesstamp для убывания, и будет гарантированный порядок.

узлы расположены в случайном порядке, потому что вы читаете их как Словарь, представляющий собой неупорядоченные наборы пар ключ: значение.

let currentUserChatList = snapshot.value as? NSDictionary

Если вы хотите, чтобы они были в порядке В, то сделайте это

let currentUserChatList = snapshot.children.allObjects as! [DataSnapshot]

который будет поддерживать их порядок, и вы можете перебирать их с помощью цикла for, как в вашем вопросе.Каждый дочерний элемент также будет DataSnapshot, так что вы можете получить доступ к дочерним узлам с помощью

let child in currentUserChatList {
   let msg = child.childSnapshot(forPath: "msg").value as? String ?? "No Msg"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...