Я заполняю свой CollectionView функцией loadData (), которая вызывается в методе ViewDidLoad ().Здесь я анализирую все данные из моей базы данных Firebase в реальном времени в массив (сообщения).Затем в методе cellForItemAt я установил все изображения, метки и текстовые представления соответственно на основе информации в массиве сообщений, используя indexPath.item.Довольно простые вещи.
Однако в моей базе данных есть две таблицы: записи и пользователи.В сообщениях я собираю только информацию, касающуюся сообщения и идентификатора пользователя автора.Затем я хочу получить данные от пользователей, так как изображение профиля и имя пользователя могут со временем меняться, поэтому я не хочу, чтобы они оставались внутри таблицы сообщений в базе данных.
Проблема, с которой я сталкивался ранее: Я загрузил данные из записей в loadData () и затем получил бы информацию о пользователе в методе cellForItemAt на основе идентификатора пользователя, сохраненного в массиве записей.Это вызвало нестабильность моего приложения: прокрутка к новым ячейкам инициировала метод cellForItemAt, заставляя его запрашивать данные, а затем обновлять их.Так что будет задержка, так как информация должна была быть загружена.Абсолютно уверен, что это было причиной, так как теперь я установил для него изображение по умолчанию (без изображения в профиле) и имя пользователя по умолчанию («Имя пользователя»), что делает его снова очень плавным.
Затем я перешел к извлечениюuserData и проанализируйте его в другом массиве (userInfo):
struct userData {
var userFirstName: String
var userLastName: String
var userProfilePicURL: String
}
var userInfo = [String : userData]()
Я могу использовать это как userInfo [posts.userID], что именно то, что я искал.Проблема, с которой я столкнулся, состоит в том, что userInfo не заполняется во времени, возвращая ноль, когда я выгружаю массив в cellForItemAt:
dump(userInfo[post.userID])
Так что это возвращает ноль при загрузке приложения, но когда я прокручиваю, и таким образомИнициализируйте cellForItemAt снова, он возвращает значения.Таким образом, мое обоснованное предположение состоит в том, что данные не извлекаются вовремя.Сейчас я ищу способ вызывать cellForItemAt только тогда, когда загружается массив posts и пользовательский массив.
Как добавить значения в пользовательский массив, внутри функции loadData, где dict ["userID"]полученные путем наблюдения за сообщениями в базе данных:
Ref.child("users").child(dict["userID"] as! String).observeSingleEvent(of: .value) { (snapshot) in
let userValues = snapshot.value as! [String: Any]
userInfo[dict["userID"] as! String] = userData(userFirstName: userValues["userFirstName"] as! String, userLastName: userValues["userLastName"] as! String, userProfilePicURL: userValues["userProfilePicURL"] as! String)
}
Я хочу убедиться, что информация добавляется в массив, прежде чем показывать ячейки, чтобы они могли соответственно изменить изображение профиля и имя пользователя.Я хочу сделать это в методе cellForItemAt.Я думал об использовании таймеров, скрывая свой CollectionView на пару секунд, но все это будет зависеть от скорости соединения и т. Д., Поэтому я думаю, что должно быть более подходящее решение.
Любые полезные идеи приветствуются!