Firebase datadescription возвращает пустой массив - PullRequest
0 голосов
/ 24 мая 2019

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

эта строка кода показывает, что она не пуста

print («Кэшированные данные документа: (dataDescription)»)

var user:String = (Auth.auth().currentUser?.email)! // I used email as name of document.

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")
        }
    }
    // Do any additional setup after loading the view.
    print(Groups)

}

Вот мои результаты: document.data () отображается как словарь, когда я нахожусь над определением

[:] // Показано как пустое ??

Кэшированные данные документа: Необязательно (["test new": test new, "g3": g3, "g1": g1])

Большое спасибо за помощь в этом вопросе.

1 Ответ

1 голос
/ 24 мая 2019

Основная проблема заключается в том, что 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 раз и не влиять на ваше приложение.

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