Как я могу получить список детей в снимке Firebase по порядку? - PullRequest
0 голосов
/ 19 декабря 2018

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

Данные в Firebase хранятся с автоматическим идентификатором вверху.Каждое смещение прокрутки и истекшее время затем сохраняются в своем собственном дочернем автоматическом идентификаторе ниже родительского.В веб-приложении Firebase дети находятся в правильном порядке.

Я извлекаю данные из Firebase следующим образом:

ghostref.queryOrderedByKey().queryLimited(toLast: UInt(1)).observe(.childAdded, with: { (snapshot) in

       guard let ghostdict = snapshot.value as? [String:[String:String]] else {
            print("failure")
            return
        }

        var downloadedghostarray = [(cameray:Float, timeelapse:Double)]()

        for key in ghostdict.keys {
            downloadedghostarray.append((cameray: Float(ghostdict[key]!["cameray"]!)!, timeelapse: Double(ghostdict[key]!["timeelapse"]!)!))
        }
}

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

РЕДАКТИРОВАТЬ: Вот данные, как они отображаются в веб-приложении Firebase в нужном порядке:

enter image description here

А вот массив, который рендерится с использованием кода выше:

enter image description here

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018
class func downloadAllMessages(forUserID: String, completion: @escaping ([Message]) -> Swift.Void, locationCompletion: @escaping (String) -> Swift.Void) {
    if let userID = Helper.shared.driverLoggedInDetails.detail?.userid {
        let currentUserID = "D\(userID)"

        dbReference.child("users").child(currentUserID).child("conversations_list").child(forUserID).observeSingleEvent(of: .value) { (snapshot) in
            if snapshot.exists() {
                let data = snapshot.value as! [String: Any]
                let location = data["location"]!
                locationCompletion(location as! String)

                dbReference.child("messages").child(location as! String).observe(.childAdded, with: { (snap) in
                    if snap.exists() {

                        let receivedMessages = snap.value as! [String: Any]
                        var messages1 = [Message]()
                        let type = MessageType.text

                        let text = (receivedMessages as NSDictionary).object(forKey: "text") as? String
                        let mmText = (receivedMessages as NSDictionary).object(forKey: "mmText") as? String
                        let messageType = (receivedMessages as NSDictionary).object(forKey: "messageType") as? Int

                        let fromID = (receivedMessages as NSDictionary).object(forKey: "senderId")as? String
                        let timestamp = (receivedMessages as NSDictionary).object(forKey: "timeStamp")as? Int
                        let isRead = (receivedMessages as NSDictionary).object(forKey: "read")as? Bool
                        let isvisible  = UserDefaults.standard.object(forKey: "chatwindow") as? Bool
                        if fromID != currentUserID, isvisible ?? false {
                            dbReference.child("messages").child(location as? String ?? "").child(snap.key).child("read").setValue(true)
                        }

                        if fromID == currentUserID {
                            let message = Message.init(type: type, textEn: text ?? "", textMM: mmText ?? "", owner: .receiver, timestamp: timestamp ?? 0, isRead: isRead ?? false, isSuggested: messageType == -1 ? true : false)
                            messages1.append(message)

                        } else {
                            let message = Message.init(type: type, textEn: text ?? "", textMM: mmText ?? "", owner: .sender, timestamp: timestamp ?? 0, isRead: isRead ?? false, isSuggested: messageType == -1 ? true : false)
                            messages1.append(message)
                        }

                        completion(messages1)
                    }else {
                        // LoadingIndicator.shared.hide()
                        completion([])
                    }
                })
                // LoadingIndicator.shared.hide()
                completion([])
            }
        }
    }
}
0 голосов
/ 19 декабря 2018

U можно получить, добавив числовое поле в документ Firebase из 1..n, чтобы вы могли использовать запрос на основе возрастания / убывания.Результатом будет ваш ожидаемый результат

0 голосов
/ 19 декабря 2018

Итерируя поля узла по ключу и упорядочивая их по ключу, вы фактически рандомизируете элементы в своем списке.Словари / карты, основанные на хэше, не гарантируют, что порядок поддерживается.

Вам нужно будет выполнить итерацию снимка, используя children , что (я полагаю) обеспечивает этот порядокдети поддерживаются.Этот порядок должен позволять вам помещать их в другой массив, порядок которого гарантирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...