Есть много способов сделать это - вот два. Первый использует группу диспетчеризации, а второй использует и индексирует технику.
У меня есть массив слов, и я хочу записать их в 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")
}
})
}
}