Сколько «чтений» стоит для вызова функции get() при извлечении данных из Firestore

У меня есть следующий фрагмент кода в функции, которую я вызываю, когда мне нужно получить данные профиля пользователя.

  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;
    }
  }

Если предположить, что данные профиля пользователя не меняются, стоит ли мне этот вызов 1 чтения каждый раз, когда я вызываю функцию getUserProfile()? Если да, то как я могу изменить эту функцию, чтобы моя функция только прослушивала изменения и не обязательно увеличивала количество чтений в firestore?

Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
1
0
108
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Да, каждый вызов функции будет стоить вам 1 чтение. Если данные не меняются в приложении, вы можете получить их в начале приложения и сохранить, создав класс, скажем, User, а затем добавить данные в этот объект User. Этот метод очень полезен и минимизирует количество вызовов функций для выборки данных.

Ответ принят как подходящий

Каждый раз, когда вы вызываете 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.

Другие вопросы по теме