Получить информацию о пользователе Firebase в посте с другим запросом - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть две таблицы в моей базе данных Firebase в реальном времени: сообщения и пользователи.Структура:

users
-- userID
---- userName
---- userProfilePicURL

posts
-- postID
---- postTimeStamp
---- postTitle
---- postContent

Теперь я выбираю данные в функции loadData () следующим образом:

var Ref: DatabaseReference!
Ref = Database.database().reference()

Ref.child("posts").queryOrdered(byChild: "postTimeStamp").observeSingleEvent(of: .value) { (snapshot) in

    for child in snapshot.children {

        let snap = child as! DataSnapshot
        let dict = snap.value as! [String: Any]

        // set all additional information and append to array

        self.collectionView?.reloadData()

    }

}

Это работает отлично.Однако я хочу выполнить второй запрос для получения информации о пользователе (userName, userProfilePicURL), чтобы ее можно было также отобразить, поскольку все, что у меня сейчас есть, это userID.Я делаю это следующим образом:

var Ref: DatabaseReference!
Ref = Database.database().reference()

Ref.child("posts").queryOrdered(byChild: "postTimeStamp").observeSingleEvent(of: .value) { (snapshot) in

    for child in snapshot.children {

        let snap = child as! DataSnapshot
        let dict = snap.value as! [String: Any]

        Ref.child("users").child(dict["userID"] as! String).observeSingleEvent(of: .value, with: { (snapUser) in

            let valueUser = snapUser.value as! [String: Any]

            // set all additional information and append to array

            self.collectionView?.reloadData()

        }

    }

}

Что происходит, так это то, что он получает информацию о пользователе и отображает ее правильно, но хронологический порядок моего первого запроса разрушен.Он показывает все сообщения одного и того же пользователя, поэтому они упорядочены по userID, а не по postTimeStamp.Есть ли какое-то исправление или мне нужно подходить к этому совершенно по-другому?

ОБНОВЛЕНИЕ: Что я нашел до сих пор Когда я выполняю print (dict), все отображается в правильномпорядок.Таким образом, ошибка возникает на более позднем этапе.Когда я выполняю dump (self.posts), который является массивом со всеми сообщениями, они отображаются в неправильном порядке.

Я предполагаю, что вместо добавления элементов в хронологическом порядке, как было запрошено в первом запросе,они добавляются на основе идентификатора пользователя, поэтому приложение выбирает все сообщения для каждого идентификатора пользователя.Однако я понятия не имею, почему это так, и я не могу найти его в Интернете.

1 Ответ

0 голосов
/ 28 сентября 2018

Причина:

  • Причина ошибки заключается в том, что вы использовали асинхронный метод в цикле for.
  • Таким образом, вы не получили данные в порядке, так как извлекали данные из базы данныхэто асинхронный метод.Вы должны использовать другой массив для пользователя и управлять им, используя useriD

Решение:

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