У меня есть некоторый код RxFire, который прослушивает запрос коллекции Firestore (представляющий каналов ) и для каждого из результатов прослушивает ссылку на базу данных в реальном времени для документов (представляющую сообщения )в этом канале).
Проблема, с которой я сталкиваюсь, состоит в том, что документы базы данных реального времени перезагружаются каждый раз, когда изменяется запрос Firestore, даже если они для пути / ссылки, которая не изменилась.
Вот некоторый псевдокод:
collection(channelsQuery).pipe(
// Emits full array of channels whenever the query changes
switchMap(channels => {
return combineLatest(
channels.map(channel =>
// Emits the full set of messages for a given channel
list(getMessagesRef(channel)),
),
);
})
)
Представьте себе следующий сценарий:
- Запрос изначально генерирует 3 Документы канала Firestore
- Наблюдаемые создаются для соответствующих ссылок базы данных реального времени для тех 3 каналов, которые излучают свои документы сообщений
- Добавляется новый документ Firestore, соответствующий исходному запросу, который теперь генерирует 4 канальные документы
- Предыдущие наблюдаемые для базы данных реального времени уничтожаются, а новые создаются для текущего 4 чанnels, повторно загружая и испуская все данные, которые у него уже были за предыдущий 3 .
Очевидно, что это не идеально, так как вызывает много избыточных чтений в базе данных реального времени,Какова лучшая практика в этом случае?Имейте в виду, что когда канал удален, я хотел бы уничтожить соответствующую наблюдаемую вещь, которую switchMap
уже делает.