【发布时间】:2019-10-22 09:02:58
【问题描述】:
我正在开发一个 PWA,它显示一个交易列表(交易是一个包含大约 10 个字段的对象)。我正在使用 firestore 进行存储和实时更新,我也有 enabled persistance。
我希望我的应用程序将所有数据都保存在内存中,并且我希望自己只显示必要的信息(例如,对事务列表使用虚拟滚动)。由于这个原因,我听了整个收藏(也就是交易)。
在应用程序启动时,我想确保数据已加载,因此我使用one time cache query 获取事务。我希望查询几乎是即时的,但是在笔记本电脑上大约需要 1 秒才能获取初始数据(而且我还有另一个从缓存中获取的集合,这会在 2 秒后解决交易请求后)。对于移动设备,大约需要 ~9 秒 (loading on mobile, loading on laptop)
我希望我的应用感觉是即时的,但我需要几秒钟才能获得数据。请注意,我没有进行任何高级查询(我只是想将数据加载到内存中)。
我是不是做错了什么?我已阅读 Firestore 文档,但我认为缓存中的数据量不会导致性能如此糟糕。
更新:即使我将初始查询限制为仅加载 20 个文档。检索它们仍然需要大约 2 秒。
更新 2: 代码如下所示:
export const initializeFirestore = (): Thunk => (dispatch) => {
const initialQueries: Array<Promise<unknown>> = []
getQueries().forEach((query) => {
const q = query.createFirestoneQuery()
initialQueries.push(
q
.get({
source: 'cache',
})
.then((snapshot) =>
dispatch(firestoneChangeAction(query, snapshot, true)),
),
)
q.onSnapshot((change) => {
dispatch(firestoneChangeAction(query, change))
})
})
console.log('Now I am just waiting for initial data...')
return Promise.all(initialQueries)
}
【问题讨论】:
-
这里有一篇关于why Firestore queries may be running slow的有趣读物。
-
您在打开应用程序时加载了多少文档?也请回复@AlexMamo
-
@PabloAlmécijaRodríguez 是的,这部分与我最相关:“第三,考虑减少离线缓存的大小。移动设备上的缓存大小默认设置为 100MB,但在某些在这种情况下,这可能是您的设备无法处理的太多数据,尤其是当您最终将大部分数据集中在一个庞大的集合中时。”。但如果 1500 件物品在这种情况下是一个“巨大的收藏”,我会感到非常难过。
-
@AlexMamo 我正在阅读所有这些(约 1500 个),但即使我将查询限制为 20 个文档,加载仍需要约 3 秒。
-
@AlexMamo,是的,但我发现了为什么代码这么慢。如果我删除快照订阅,代码会更快(如我所料)。也就是说,现在我首先触发初始查询并等待它们完成,然后才在查询上调用 onSnapshot ......但是,我不明白为什么这很重要。
标签: firebase google-cloud-firestore offline-caching