Обработчик завершения addDocument никогда не вызывается - PullRequest
0 голосов
/ 25 октября 2019

У меня есть функция добавления документов в коллекцию в firebase. Это делается с помощью цикла for. У меня есть DispatchGroup, и я вызываю enter () в начале каждой итерации цикла. После добавления каждого документа я хочу вызвать обработчик завершения метода addDocument. В обработчике завершения я хочу вызвать метод exit () для моей группы DispatchGroup, чтобы в конечном итоге я смог выполнить переход, когда все документы были добавлены. Моя проблема в том, что обработчик завершения никогда не вызывается, поскольку сообщения никогда не печатаются. Я вижу, что документы добавляются в мою коллекцию в firebase каждый раз, когда я запускаю код. Я что-то не так понял или что-то не так с моим подходом? Любая помощь будет принята с благодарностью. Упрощенный пример моего кода выглядит примерно так:

func uploadDocumentToFirebase(names: String[])
    {   
        for name in names
        {
            dispatchGroup.enter()

            collection.addDocument(data: ["name": name], completion: {error in

                print("Document: \(name) was uploaded to firebase")

                self.dispatchGroup.leave()
            })
        }
    }

Фактические документы, которые я добавляю, имеют 6 полей вместо 1, показанного в моем примере, если это имеет какое-либо значение.

Ответы [ 3 ]

0 голосов
/ 25 октября 2019

Есть много способов сделать это - вот два. Первый использует группу диспетчеризации, а второй использует и индексирует технику.

У меня есть массив слов, и я хочу записать их в Firestore, уведомляя о том, что каждое из них записано, а затем, когда они все записаны.

let arrayOfWords = ["boundless", "delicious", "use", "two", "describe", "hilarious"]

Вот код группы отправки. Мы входим в группу, записываем данные и в обработчике завершения, когда закончим, уходим. Когда все было оставлено, вызывается group.notify.

func writeWordUsingDispatchGroup() {
    let group = DispatchGroup()
    let wordCollection = self.db.collection("word_collection")

    for word in self.arrayOfWords {
        group.enter()
        let dataToWrite = ["word": word]
        wordCollection.addDocument(data: dataToWrite, completion: { error in
            print("\(word) written")
            group.leave()
        })
    }

    group.notify(queue: .main) {
        print("all words written")
    }
}

А затем индексный код. Все, что это делает, это вычисляет индекс последнего объекта в массиве и затем выполняет итерацию по перечисленному массиву (таким образом, мы получаем индекс). Затем, когда индекс текущего цикла совпадает с последним индексом, мы знаем, что мы закончили.

func writeWordsUsingIndex() {
    let wordCollection = self.db.collection("word_collection")
    let lastIndex = self.arrayOfWords.count - 1
    for (index, word) in self.arrayOfWords.enumerated() {
        let dataToWrite = ["word": word]
        wordCollection.addDocument(data: dataToWrite, completion: { error in
            print("\(word) written")

            if index == lastIndex {
                print("all words written")
            }
        })
    }
}
0 голосов
/ 26 октября 2019

Моя проблема в том, что обработчик завершения никогда не вызывается, поскольку сообщения никогда не печатаются.

Кажется, вы не вызываете completion внутри вашего addDocument методаПо крайней мере, для случая, когда документ успешно добавлен.

0 голосов
/ 25 октября 2019

Редактировать:

Может быть, вы можете запустить обработчик завершения, чтобы ваши выходы находились в том же месте, что и ваша группа? Я обычно пишу обработчики завершения в подобных ситуациях и вызываю их там, где у вас есть self.dispatchGroup.leave(). Вы можете поместить self.dispatchGroup.leave() в блок завершения, который может помочь? Похоже, что ваша группа имеет неодинаковое количество точек входа и выхода. Организация с блоком завершения может помочь найти его?

completion: (@escaping (Bool) -> ()) = { (arg) in })

Оригинал:

Не могли бы вы использовать этот код setData вместо addDcoument, чтобы посмотреть, поможет ли это? Вы можете добавить свою отправку в этот код и посмотреть, все ли работает. Если нет, я буду продолжать обдумывать это ...

Также, возможно, проверьте, не является ли входной массив пустым (просто распечатайте его на консоли в методе).

     let db = Firestore.firestore()

     db.collection("your path").document("\(your document name)").setData([
         "aName": "\(name)",
         "anEmail": "\(email)",
     ]) { err in
         if let _ = err {
             print("Error writing document:")
         } else {
             print("Document successfully written!")
         }
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...