Как вернуть объект из документа, хранящегося в Firestore (Swift) - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть коллекция пользователей в firebase и структура пользователя. Мне нужно написать функцию, которая принимает идентификатор пользователя и возвращает соответствующий объект пользователя:

struct AppUser: Codable {

    var id: String
    var displayName: String
    var photoURL: String
    var points: Int?
    var knownLanguageCodes: Set<String>?

}

Это моя функция, которую я имею до сих пор.

func getUser(id: String) -> AppUser? {

    let db = Firestore.firestore()
    let userRef = db.collection("users").document(id)

    userRef.getDocument { (document, error) in
         if let document = document, document.exists {
            let userID = document.data()?["id"] as! String
            let userDisplayName = document.data()?["displayName"] as! String
            let userPhotoURL = document.data()?["photoURL"] as! String
            let userPoints = document.data()?["points"] as! Int?
            let userKnownLanguageCodes = document.data()?["knownLanguageCode"] as! Set<String>?
            let user = AppUser(id: userID,
                               displayName: userDisplayName,
                               photoURL: userPhotoURL,
                               points: userPoints,
                               knownLanguageCodes: userKnownLanguageCodes)
            return user
         } else {
            print("Error getting user")
            return nil
        }
    }
}

Оба из Приведенные выше операторы return дают ошибку: Неожиданное возвращаемое значение в void функции

Я посмотрел код здесь https://cloud.google.com/firestore/docs/query-data/get-data под заголовком «Пользовательские объекты», и это не так кажется, работает на меня. Я получаю ошибку: значение типа 'NSObject' не имеет члена 'data'. Это производится в строке 6 кода в ссылке.

1 Ответ

1 голос
/ 14 февраля 2020

Вы не можете вернуться внутрь замыкания, используйте завершение, например

func getUser(id: String,completion:@escaping((AppUser?) -> ())) {

    let db = Firestore.firestore()
    let userRef = db.collection("users").document(id) 
    userRef.getDocument { (document, error) in
         if let document = document, document.exists {
            let userID = document.data()?["id"] as! String
            let userDisplayName = document.data()?["displayName"] as! String
            let userPhotoURL = document.data()?["photoURL"] as! String
            let userPoints = document.data()?["points"] as! Int?
            let userKnownLanguageCodes = document.data()?["knownLanguageCode"] as! Set<String>?
            let user = AppUser(id: userID,
                               displayName: userDisplayName,
                               photoURL: userPhotoURL,
                               points: userPoints,
                               knownLanguageCodes: userKnownLanguageCodes)
            completion(user)
         } else {
            print("Error getting user")
            completion(nil)
        }
    }
}

Вызов

getUser(id:<#str#>) { user in
  print(user)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...