Как отделить начальную нагрузку от инкрементальных детей с Firebase?
У меня есть приложение, в котором новые дети добавляются в Firebase каждые 5 секунд или около того. У меня тысячи детей.
При загрузке приложения я хотел бы обработать начальные тысячи по-разному от последующих потомков, которые просачиваются каждые 5 секунд.
Вы можете предложить мне использовать значение, обрабатывать все, а затем использовать children_added. Но я считаю, что если обработка занимает слишком много времени, у меня есть потенциал пропустить точку.
Есть ли способ сделать это в Firebase, который гарантирует, что я не пропущу точку?
Ответы
Ответ 1
Так как события child_added
для исходных, предварительно загруженных данных срабатывают до того, как событие value
срабатывает у родителя, вы можете использовать событие value
как своеобразное уведомление об исходных данных. Вот код, который я слегка изменил из fooobar.com/questions/39114/....
var initialDataLoaded = false;
var ref = new Firebase('https://<your-Firebase>.firebaseio.com');
ref.on('child_added', function(snapshot) {
if (initialDataLoaded) {
var msg = snapshot.val().msg;
// do something here
} else {
// we are ignoring this child since it is pre-existing data
}
});
ref.once('value', function(snapshot) {
initialDataLoaded = true;
});
К счастью, Firebase будет аккуратно кэшировать эти данные, а это означает, что создание как слушателей child_added
, так и value
будет загружать данные только один раз. Добавление новых слушателей Firebase для данных, которые уже пересекли провод, чрезвычайно дешево, и вы должны чувствовать себя комфортно, делая такие вещи регулярно.
Если вы беспокоитесь о загрузке всех этих исходных данных, когда вам это действительно не нужно, я буду следовать рекомендациям @FrankvanPuffelen в комментариях, чтобы использовать timestamped query. Это работает очень хорошо и оптимизировано с использованием запросов Firebase.
Ответ 2
Улучшен ответ от @jacobawenger, чтобы не использовать глобальную переменную состояния
var ref = new Firebase('https://<your-Firebase>.firebaseio.com');
ref.once('value', function(snapshot) {
// do something here with initial value
ref.on('child_added', function(snapshot) {
// do something here with added childs
});
});
Ответ 3
Существует два возможных решения этой проблемы, не удовлетворяющие:
1) Отметьте ваши дети и запросите только детей, у которых метка времени больше, чем значение "сейчас". Это не здорово, потому что у вас может возникнуть синхронность между вашим приложением "сейчас" и "сейчас" на то, что толкает данные на Firebase или значение сервера Firebase для "сейчас".
2) Использовать значение и добавить ребенка. Любые дубликаты, увиденные в child_added, которые уже были замечены в ценности, могут быть отброшены. Это невозможно использовать для больших наборов данных, так как требует загрузки всех исторических данных TWICE!
Почему не может быть такой команды, как "child_added", которая НЕ дает все когда-либо?