Всегда получаю ноль в завершении - PullRequest
0 голосов
/ 13 октября 2019

Я пытаюсь получить Map data У меня есть Firestore, вот как это выглядит: enter image description here

Я пытаюсь получить данные, исоздать массив Friend Object и вернуть array в completion handler.

Вот что у меня есть:

func fetchFriendList(_ id: String, completion: @escaping([Friend]?)->()) {
    var fetchedFriends: [Friend]?
    db.collection(USERS_COLLECTION).document(id).getDocument { (doc, err) in
        if err == nil && doc != nil {
            guard let results = doc?.data()?[USER_FOLLOWING] as? [String: Any] else { return }
            for result in results { // Getting the data in firebase
                if let resultValue = result.value as? [String: Any] { // Getting only the value of the MAP data, we do not need the key.

                    //Getting the fields from the result
                    guard let id = resultValue[FRIEND_ID] as? String else { return }
                    guard let profilePic = resultValue[FRIEND_PROFILE_PIC] as? String else { return }
                    guard let username = resultValue[FRIEND_NAME] as? String else { return }
                    guard let email = resultValue[FRIEND_MAIL] as? String else { return }

                    //Creating a new Friend object from the fields
                    let friend = Friend(id: id, profilePicture: profilePic, username: username, email: email)
                    fetchedFriends?.append(friend)
                }
                completion(fetchedFriends)
            }
        }else {
            print(err!.localizedDescription)
            completion(nil)
        }
    }
}

Я попытался распечатать результаты, resultValue и т. д.,они не ноль. Но после попытки добавить и распечатать массив fetchedFriends я получаю ноль, а завершение также равно нулю. Я не очень понимаю, почему это происходит.

1 Ответ

1 голос
/ 13 октября 2019

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

func fetchFriendList(_ id: String, completion: @escaping([Friend]?)->()) {
    var fetchedFriends: [Friend] = []
    db.collection(USERS_COLLECTION).document(id).getDocument { (doc, err) in
        if err == nil && doc != nil {
            guard let results = doc?.data()?[USER_FOLLOWING] as? [String: Any] else { return }
            for result in results { // Getting the data in firebase
                if let resultValue = result.value as? [String: Any] { // Getting only the value of the MAP data, we do not need the key.

                    //Getting the fields from the result
                    guard let id = resultValue[FRIEND_ID] as? String else { return }
                    guard let profilePic = resultValue[FRIEND_PROFILE_PIC] as? String else { return }
                    guard let username = resultValue[FRIEND_NAME] as? String else { return }
                    guard let email = resultValue[FRIEND_MAIL] as? String else { return }

                    //Creating a new Friend object from the fields
                    let friend = Friend(id: id, profilePicture: profilePic, username: username, email: email)
                    fetchedFriends.append(friend)
                }
                completion(fetchedFriends)
            }
        }else {
            print(err!.localizedDescription)
            completion(nil)
        }
    }
}

Надеюсь, это поможет.

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