【问题标题】:How can I reduce my reads on Firestore with Flutter?如何使用 Flutter 减少对 Firestore 的读取?
【发布时间】:2021-09-06 17:19:16
【问题描述】:

我知道可以使用 GetOptions 命令(来源:Source.cache)来减少不必要的读取。我的问题是,我怎样才能通过缓存运行我的 Firestore 查询,如果那里什么都没有,即缓存是空的,通过服务器?

我的代码将类似于...

  _getLikes() {
User _user = _firebaseAuth.currentUser;
 FirebaseFirestore.instance.collection('Users')
    .doc(_user.uid)
    .collection("Likes")
    .where('liked', isEqualTo: true)
    .snapshots()
    .listen((_querySnapshot) {
  //likedList.clear();
  if (_querySnapshot.docs.isNotEmpty) {
    _querySnapshot.docs.forEach((_likedDocumentSnapshot) async {
      await  FirebaseFirestore.instance.collection('Users')
          .doc(_likedDocumentSnapshot.data()['likedId'])
          .get()
          .then((_usersDocumentSnapshot) {
        if (_usersDocumentSnapshot.exists) {
          User _tempUser =
              User.fromDocument(_usersDocumentSnapshot);

          liked.add(_tempUser);

          if (mounted) setState(() {});
        }
      });
    });
  }
});
}

User 是我的类,我在其中管理服务器的内容,例如用户的姓名和年龄。

我只需要知道如何使用它

GetOptions(source: Source.cache)

里面

get()

如果缓存为空

GetOptions(source: Source.server)

首先我的函数 getLikes() 应该查看数据是否在缓存中并从那里加载。如果它不在缓存中,则应该从服务器加载数据。

非常感谢您的帮助,在 Google 上找不到任何内容。

【问题讨论】:

    标签: flutter caching google-cloud-firestore server cloud


    【解决方案1】:

    您有两种方法可以实现这一目标:

    1. 一个带有源选项。使用源选项,get() 调用 DocumentReferenceQuery。通过提供源 值,这些方法可以配置为仅从 服务器,仅从本地缓存中,或尝试获取结果 从服务器返回并回退到缓存(这是默认设置)。

    这是一个代码示例,展示了如何使用source options 来了解数据是从缓存、服务器还是默认获取的。 您也可以编写代码先查询缓存,如果不存在则回退到服务器,如下所示:

    let snapshot = await documentRef.get({ source: 'cache' }
    if (!snapshot.exists) {
       snapshot = await documentRef.get({ source: 'server' })
    }
    

    这可能是节省读取操作成本的好方法,但如果 source : cache 每次都为真,则应用不会从服务器读取文档,而只会从缓存中读取,它可能永远看不到对文档的数据。因此,第二个选项 - SnapshotMetadata 更合适。

    1. 其次,使用您的 SnapshotMetadata 中的 fromCache 属性 快照事件。如果 fromCache 为真,则数据来自缓存 并且可能没有更改/更新。如果 fromCache 为 false,则 数据是完整的,并且是最新的,服务器上的最新更新。

    这是一个代码示例,展示了如何使用 SnapshotMetadata changes 来了解数据是从缓存中还是从服务器中获取的。

    【讨论】:

    • 感谢您的详细回答。我几乎认为 get 不是最好的选择。我也没有读到任何关于它的好东西。我一定会尝试第二个变种。 :)
    【解决方案2】:

    首先我的函数 getLikes() 应该查看数据是否在缓存中并从那里加载。如果它不在缓存中,则应该从服务器加载数据。

    您在这里所描述的完全是 snapshots() 的工作原理。你考虑过使用它吗?

    【讨论】:

    • 暂时没有...我刚刚读到可以借助 get (GetOptions (source: Source.cache)) 从缓存中获取数据。请你在我的例子中告诉我你的意思是什么?
    猜你喜欢
    • 2019-12-29
    • 2021-05-22
    • 2021-04-04
    • 2021-11-23
    • 2020-03-31
    • 1970-01-01
    • 2021-06-08
    • 2019-10-22
    • 1970-01-01
    相关资源
    最近更新 更多