【问题标题】:How many "read"s does it cost to call get() function when fetching data from Firestore从 Firestore 获取数据时调用 get() 函数需要多少“读取”次数
【发布时间】:2020-12-10 21:58:37
【问题描述】:

我在需要获取用户配置文件数据时调用的函数中有以下代码片段。

  FirebaseAuth _auth = FirebaseAuth.instance;
  final FirebaseFirestore _firestore = FirebaseFirestore.instance;

  Future getUserProfile() async {
    try {
      DocumentSnapshot ds =
          await _firestore.collection('users').doc(_auth.currentUser.uid).get();

      return ds;
    } catch (e) {
      print(e);
      return null;
    }
  }

假设用户的个人资料数据不变,每次调用getUserProfile() 函数时,此调用是否会花费我 1 次阅读?如果是,我该如何更改此函数,以便我的函数仅侦听更改而不一定增加 firestore 中的读取次数?

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

    是的,每个函数调用将花费您 1 次阅读。如果数据在整个应用程序中没有发生变化,您可以在应用程序开始时获取它并通过创建一个类如User 来存储它,然后将数据添加到该User 对象。此方法非常有用,可以最大限度地减少为获取数据而进行的函数调用次数。

    【讨论】:

      【解决方案2】:

      每调用一次getUserProfile(),读计数器就会加一。

      Firestore 提供了get() 的替代方案,用于收听实时更改。它被称为snapshots(),它返回一个Stream<QuerySnapshot>。您可以附加一个侦听器,每次您收听的文档之一发生更改时,它都会被添加到流中。最初,与您的查询匹配的所有项目(在您的情况下只有一个)将被添加到流中。你的代码应该是:

        Stream<QuerySnapshot> getUserProfile() {
          try {
            Stream<QuerySnapshot> stream = _firestore
                .collection('users')
                .doc(_auth.currentUser.uid)
                .snapshots();
            return stream;
          } catch (e) {
            print(e);
            return null;
          }
        }
      

      每次向流中添加更改时,读取将增加一。

      更多信息可关注官方Firestore Docs

      【讨论】:

        猜你喜欢
        • 2021-01-02
        • 2021-09-10
        • 1970-01-01
        • 2019-02-01
        • 1970-01-01
        • 2021-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多