每次加载应用程序时,如何防止 Firestore 加载整个用户数据

Posted

技术标签:

【中文标题】每次加载应用程序时,如何防止 Firestore 加载整个用户数据【英文标题】:How do I prevent firestore from loading entire user data every time the app loads 【发布时间】:2019-04-27 15:23:00 【问题描述】:

我正在使用 Flutter 和 redux 进行状态管理。当应用程序加载时,我正在从 firestore 加载数据以填充我的 redux 状态。现在的问题是每次应用程序初始化时都会读取 800 多个文档。更改用户数据的唯一来源是应用程序本身,并且由于启用了 Firestore 本地持久性,不应该从本地缓存加载数据吗?..我错过了什么?

有趣的是,如果我禁用与设备的互联网连接,加载应用程序然后启用连接,应用程序仍然可以正常工作(可能没有从应用程序初始化过程中读取文档,因为它们来自缓存) .

基本上,所需的行为是应用程序使用本地数据进行初始化,然后仅将用户所做的更新同步到 firebase 服务器。

class _MyAppState extends State<MyApp> 
    final store = new Store<AppState>(
    appReducer,
    initialState:  new AppState(isLoading: true, logs: []),
    middleware: [thunkMiddleware]);


    initState()
        super.initState();
        loadData();
      

   loadData()
        FirebaseAuth.instance.currentUser().then( (loggedInUser) async 
          if(loggedInUser==null)
            store.dispatch(SetUser(null));
          
          QuerySnapshot logsQuery = await Firestore.instance.collection("/users/"+loggedInUser.uid+"/logs").getDocuments();
          List<Log> logs = [];
          final logDocs = logsQuery.documents;
          for (DocumentSnapshot logDoc in logDocs) 
            logs.add(Log.fromFireStoreData(logDoc.documentID, logDoc.data));
          
          store.dispatch(SetUserLogs(logs));
        
      
...
    

【问题讨论】:

【参考方案1】:

我会说问题甚至不是 redux 或 firestore 持久性,因为没有足够的信息 (没有 redux 是否可以工作?你是如何获取这些数据的?给我们看一些代码)在帖子中我会尽量按原样回答,但你应该详细说明一下。

非常重要的是要注意,如果您从基本上任何东西中读取超过 800 次,则存在一个大问题,任何类型的应用程序中的任何东西都不应该能够预先远程生成 800 次读取。

首先,您必须优化此用户数据查询,可能还有数据的 firebase 结构,为此我建议您从 Firebase YouTube 官方频道观看 this video 并阅读 @ Firebase 文档中关于定价的 987654322@ 和关于最佳实践的 this one。从现在开始要非常小心您如何处理数据,如果这不能解决您的问题,请在您的线程中解释更多。

【讨论】:

感谢您的回复和资源。我在问题中添加了一个代码 sn-p。总结一下:应用程序是否可以使用本地数据进行初始化,然后仅将用户所做的更新同步到 firebase 服务器。

以上是关于每次加载应用程序时,如何防止 Firestore 加载整个用户数据的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 如何优化 Firestore 存储读取以防止大量不必要的读取

Firestore - 节省文档读取费用

如何防止 Firestore 为预订按钮写入竞争条件

缓存视频 Firestore

SwiftUI Firestore 查询游标分页不起作用

如何防止在页面加载时执行 javascript 函数?