Главное преимущество Firestore - это возможность использовать его как источник правды онлайн / офлайн. Я использую его таким образом прямо сейчас: обновляю документ Firestore непосредственно в действии, затем слушаю изменения базы данных Firestore и отображаю это обратно в локальное состояние. Однако полагаться на эту компенсацию задержки и отображение обратно в локальное состояние недостаточно для быстрых обновлений (касания, переключения даже при небольшом размере документа). Например, переключатели будут «дрожать», когда переключатель RN предположительно переключается при нажатии, а локальное состояние не обновляется до тех пор, пока оно уже не вернет , см. Пример видео . На Android оно выглядит хуже, и проблема не ограничивается только переключениями basi c.
Будет ли какая-либо из следующих компенсаций задержки воздействовать?
- Размер документа (наши документы сейчас очень малы, и мы предполагаем, что увеличение их размера повлияет на компенсацию задержки).
- Размер набора результатов запроса. Наш набор результатов - худший случай 1000 документов. Будет ли меньший размер результата запроса влиять на задержку компенсации?
- Использование запросов с пользовательскими индексами. Примечание: в настоящее время мы не читаем из кэша, мы используем JS SDK
- Несколько записей. Не ухудшит ли множественные записи один и тот же документ (4 быстрых записи против 2 быстрых записей)
- Использование встроенного модуля против JS. В настоящее время мы используем Firestore Web SDK с приложением Expo. Мы бы предпочли не извлекать из Expo на данный момент, но посмотрим, улучшится ли компенсация задержки.
Распространено ли для людей создание локального слоя подкладки данных / состояния локального приложения с приложениями React Native / Firestore? Существуют ли какие-либо предлагаемые библиотеки для этого?
При загрузке приложения подключите прослушиватель и экспортируйте результат в контекст для использования через приложение
const [user, setUser] = useState();
firebase.firestore().collection(`users/${user.uid}`).onSnapshot(qs => setUser(oldState => {
const newState = {};
qs.docChanges().forEach(change => {
if (change.type === "added" || change.type === "modified") {
newState[change.doc.id] = {
docid: change.doc.id,
...change.doc.data(),
};
} else if (change.type === "removed") {
delete oldState[change.doc.id];
}
});
return {
...oldState,
...newState,
};
}))
Пример компонента и функции для переключения уведомлений: (переключение дрожит)
const toggleNotifications = (user, value) => {
firebase.firestore().doc(`users/${user.uid}`).update({
wantNotifications: value,
});
};
const TestComponent = () => {
//gets from context, set in listener mounted on app load
const { user } = useUserContext();
return (
<Switch
value={user.wantNotifications}
onValueChange={value => toggleNotifications(user, value)}
/>
);
};