Получите все документы одновременно в обработчике завершения с getDocuments в Firestore - PullRequest
0 голосов
/ 08 февраля 2020

Прямо сейчас мой код получит асинхронные данные c и добавит их в словарь (мой UserModel)

UserAPI:

// Get all Users
func allUser (completion: @escaping (UserModel) -> Void) {

    let db = Firestore.firestore()
    let docRef = db.collection("users")
    docRef.getDocuments { (querySnapshot, err) in
        for document in querySnapshot!.documents {
            let dic = document.data()
            let user = UserModel(dictionary: dic)
            completion(user)
        }
    }
}

В моем ViewController:

UserApi.shared.allUser { (user) in
        self.users.append(user)
        self.tableViewUsers.reloadData()
    }

Я пытаюсь изменить свой подход и хочу загрузить ВСЕ данные, которые у меня есть в моем словаре. Я попробовал это с DispatchGroup (у меня нет опыта работы с DispatchGroups, но я его погуглил):

UserAPI: пробовал с Dispatch Group

// Get all Users
func allUser (completion: @escaping ([UserModel]) -> Void) {

    let dispatchGroup = DispatchGroup()
    var model = [UserModel]()

    let db = Firestore.firestore()
    let docRef = db.collection("users")
    docRef.getDocuments { (querySnapshot, err) in

        for document in querySnapshot!.documents {
            dispatchGroup.enter()
            print("disp enter")
            let dic = document.data()
            model.append(UserModel(dictionary: dic))
            dispatchGroup.leave()
            print("disp leave")
        }
    }
    dispatchGroup.notify(queue: .main) {
        completion(model)
        print("completion")
    }
}

С этим кодом сначала вызывается обработчик завершения, что явно не то, что мне нужно.

Что нужно исправить, чтобы загрузить все данные одновременно?

1 Ответ

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

Для каждой асинхронной операции необходимо только один раз войти в группу отправки и выйти из нее. Поскольку (насколько я вижу) у вас есть только один getDocuments звонок, вам следует звонить только enter и leave один раз.

Так что-то вроде:

let dispatchGroup = DispatchGroup()
var model = [UserModel]()

let db = Firestore.firestore()
let docRef = db.collection("users")
dispatchGroup.enter()
docRef.getDocuments { (querySnapshot, err) in

    for document in querySnapshot!.documents {
        let dic = document.data()
        model.append(UserModel(dictionary: dic))
    }
    dispatchGroup.leave()
}
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...