Эффективное создание цепочки getDocument с помощью Firestore (Swift) - PullRequest
0 голосов
/ 28 сентября 2018

Вопрос в том, как я могу исправить приведенный ниже код, чтобы он правильно получал всю контактную информацию?В настоящее время он пропускает документы с настройкой ниже.

Макет БД:

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).

...