У меня есть следующий фрагмент кода в функции, которую я вызываю, когда мне нужно получить данные профиля пользователя.
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?
Да, каждый вызов функции будет стоить вам 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.