Ваша основная проблема, кажется, связана с тем фактом, что вы регенерируете массив категорий каждый раз, когда запускаете свой подзапрос, и когда вы это делаете, вы предоставляете только один массив вопросов для всего этого.
Есть много способов исправить это. Я бы, вероятно, разбил его так, чтобы вы a) сначала позволили себе создать массив категорий без каких-либо вопросов, а затем b) вернулись бы к каждому из ваших отдельных подзапросов и вставляли их в свои категории по мере их получения.
Ваш окончательный код может выглядеть примерно так. Обратите внимание, что это будет означать изменение вашего объекта Category, чтобы вы могли сначала создать его без массива вопросов, и реализацию этого пользовательского метода addQuestions:toCategory:
(что было бы намного проще, если бы вы хранили свои категории в виде словаря вместо массива)
db.collection("Categories").order(by: "id", descending: false).getDocuments {
(querySnapshot, error) in
if error != nil {
print("Error when getting data \(String(describing: error?.localizedDescription))")
} else {
self.categoriesArray = querySnapshot?.documents.compactMap({CategoryFB(dictionary: $0.data()})
for document in querySnapshot!.documents {
print(document.documentID)
self.db.collection("Categories").document(document.documentID).collection("Questions").getDocuments(completion: { (subQuerySnapshot, error) in
if error != nil {
print(error!.localizedDescription)
} else {
var questionsArray: [QuestionsFB]?
questionsArray = subQuerySnapshot?.documents.compactMap({QuestionsFB(dictionary: $0.data())})
self.addQuestions(questionsArray toCategory: document.documentID)
print(self.categoriesArray![0].questions.count)
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
})
}
}
}
С другой стороны, если вы думаете, что окажетесь в ситуации, когда вы всегда захотите отвечать на ваши вопросы каждый раз, когда вы хотите получить категорию, вы можете не ставить их во вложенной коллекции вообще, и просто сделать их карту в исходном документе категории.