Основная проблема заключается в том, что FireStore является асинхронным.Для Firestore требуется время, чтобы вернуть данные из Интернета, и эти данные действительны только внутри закрытия после getDocument.
Это означает, что функция print (Groups) будет выполняться перед кодом внутризакрытие, так что пусто.Перемещение печати внутри замыкания будет работать.
var Groups = [String:Any]()
let docRef = AppDelegate.db.collection("JoinedGroups").document(user)
docRef.getDocument(source: .cache) { (document, error) in
if let document = document {
let dataDescription = document.data()
self.Groups = dataDescription! // unwrapping here
print("Cached document data: \(dataDescription)")
} else {
print("Document does not exist in cache")
}
print(self.Groups)
}
}
Могу ли я также предложить вам придерживаться соглашений об именах, где переменные - это строчные буквы, например, группы вместо групп.Верхний регистр обычно используется для определений классов UserClass или GroupClass.
И последнее. DocumentID (их «ключ») изменить нельзя.Это означает, что если ваша структура выглядит так:
JoinedGroups
jimmy@email.com
name: "Jimmy"
fav_food: "Pizza"
, и вы ссылаетесь на этого пользователя в своем приложении, когда он решит сменить своего поставщика электронной почты, вам придется проходить через всю свою структуру, читая вэтот узел, удалите узел и запишите его обратно с обновленным адресом электронной почты.Как это исправить, это отсоединить идентификатор документа (ключ) от данных, которые он содержит
JoinedGroups
users_uid
name: "Jimmy"
fav_food: "Pizza"
, поскольку uid никогда не меняется, электронная почта может меняться 20 раз и не влиять на ваше приложение.