Я использую Firebase Firestore в своем проекте приложения SwiftUI. В начале приложения я хочу прочитать несколько документов из разных коллекций.
Скажем, у меня есть коллекция A (1 документ), B (2 документа) и C (4 документа). Данные в документах из A и B определяют, какие документы из C я должен прочитать.
В настоящее время у меня есть класс DatabaseHelper, который имеет функцию readCollection для каждой коллекции (каждая из этих функций readCollection вызывает функции readDocument для создания слушателя для каждого необходимого документа). Каждая функция readCollection, а также каждая функция readDocument имеет обработчик завершения. В начале приложения я начинаю с чтения коллекции A. После завершения чтения начинается чтение B и так далее:
func listen(completion: @escaping () -> ()) {
readA() {
readB() {
readC() {
completion()
}
}
}
}
Мое приложение ожидает завершения функции прослушивания перед отображением каких-либо данных.
Этот подход «вроде как работает», ОДНАКО, он не кажется оптимальным. Например, если я читаю A, то я читаю оба документа из B, обработчик завершения из B вызывается дважды, что приводит к двум вызовам readC (), если я не подсчитываю чтение документа для B и вызываю завершение только после последнее чтение. ТО проблема в том, что только обновление второго документа в B запускает обработчик завершения и перезагружает документы из C, но не обновление первого документа в B.
Конечно, должна быть лучшая логика для загрузки моих данных из базы данных в начале моего приложения, которое обрабатывает каждое обновление документа во время выполнения правильно и без ненужных двойных чтений.
Есть ли у кого-нибудь подход лучше? Спасибо