Проблема с асинхронным обновлением поиска данных в Firestore - PullRequest
0 голосов
/ 02 апреля 2020

Я прочитал несколько потоков по извлечению данных из Firestore, но я до сих пор не смог найти ответ и сделать эту работу -> заставил меня открыть новую тему.

Я пытаюсь получить количество документов во вложенной коллекции коллекции категорий для отображения на элементе detailTextlabel в Tableview. Поиск данных для категорий (документы в старшей коллекции) работает нормально, асинхронно получает данные и отображает их на уровне cellForRow.

Однако я пытаюсь получить его подколлекцию querySnapshot? .Count, которая также затем загружается в словарь по желанию, но я не могу заставить его загрузить данные за пределы замыкания (я могу ' заставить его работать с DispatchQueue.main.asynch). Со второго по последнее оператор печати (категории) работает нормально, тот, что под ним, показывает пустой dict.

Буду очень признателен за любой вклад.

Спасибо, Иво

Пожалуйста, найдите код здесь:

func loadCategories() {

        if let currentUserEmail = Auth.auth().currentUser?.email {

            let docRef = db.collection(currentUserEmail).order(by: "Name")

            docRef.getDocuments() { (querySnapshot, err) in
                if let err = err {
                    print("Error getting documents> \(err)")
                } else {
                    for document in querySnapshot!.documents {
                        print(document.data())
                        self.categories.append(document.documentID)


                        self.db.collection(currentUserEmail).document(document.documentID)
                            .collection(document.documentID).whereField("Category", isEqualTo: document.documentID)
                            .getDocuments { (querySnapshot, error) in

                                if let error = error {
                                    print("\(error)")
                                } else {

                                    if let docCount = querySnapshot?.count {
                                        self.categoryQuestionCountSub[document.documentID] = docCount
                                    }
                                    print("\(self.categoryQuestionCountSub) outside if let")
                                }
                        }

                        DispatchQueue.main.async {
                            self.tableView.reloadData()
                        }

                    }
                    print("\(self.categories) outside of Loop")
                    print("\(self.categoryQuestionCountSub) outside of Loop")
                }
            }
        }
    }

1 Ответ

0 голосов
/ 03 апреля 2020

В случае, если кто-то сталкивается с этим - я понял, что я просто поместил блог DispatchQueue в неправильное место. Ниже вы найдете настроенный код, который работает как задумано.

func loadCategories() {

    if let currentUserEmail = Auth.auth().currentUser?.email {

        let docRef = db.collection(currentUserEmail).order(by: "Name")

        docRef.getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents> \(err)")
            } else {
                for document in querySnapshot!.documents {
                    print(document.data())
                    self.categories.append(document.documentID)


                    self.db.collection(currentUserEmail).document(document.documentID)
                        .collection(document.documentID).whereField("Category", isEqualTo: document.documentID)
                        .getDocuments { (querySnapshot, error) in

                            if let error = error {
                                print("\(error)")
                            } else {

                                if let docCount = querySnapshot?.count {
                                    self.categoryQuestionCountSub[document.documentID] = docCount


                                    DispatchQueue.main.async {
                                        self.tableView.reloadData()
                                    }

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