Вопрос в том, как я могу исправить приведенный ниже код, чтобы он правильно получал всю контактную информацию?В настоящее время он пропускает документы с настройкой ниже.
Макет БД:
user-contacts
user_id
[contact1_id, 1]
[contact2_id, 1]
contacts
contact1_id
[contact1_info]
contact2_id
[contact2_info]
Мне нужно сначала получить идентификаторы контактов из коллекции "user-contacts", а затем получить эти контактыинформация из коллекции "контакты". Пока игнорируйте пирамиду гибели if * .
let contactArr = [Contact]()
Firestore.firestore().collection("user-contacts").document(user_id).getDocument { (document, err) in
if let document = document, document.exists {
if let data = document.data() {
let contactIDs = data.keys
for (index, id) in contactIDs.enumerated() {
Firestore.firestore().collection("contacts").document(id).getDocument(completion: { (document, err) in
if let document = document, document.exists {
if let contact = document.data() {
contactArr.append(contact)
if index == contactIDs.count - 1 {
//DO STUFF WHEN DONE
//NOT ALL CONTACTS WILL BE IN THE CONTACT ARRAY HERE
}
})
}
}
})
}
}
}
}
Проблема с вышесказанным заключается в том, что я не всегда получаю все документы обратно.Кажется, что происходит какая-то проблема с потоком или что-то, что просто пропускает определенные документы.Я попытался добавить dispatchGroup, но это не сработало (очень хороший шанс, что я сделал это неправильно. Я видел, как кто-то сказал, что я не могу вызвать dispatchGroup.notify в основном потоке, так как эти вызовы Firestore находятся в основном потокеили что-то еще, но у меня нет опыта работы с dispatchGroups).