Firestore监听快照时添加文档:触发时机与计费疑问
关于Firestore实时监听与计费的问题解答
场景与代码
我使用Flutter开发应用,采用Cloud Firestore作为数据库,实现实时数据获取和文档添加/更新的代码如下:
实时数据监听代码
class Database { final usersCol = FirebaseFirestore.instance.collection('users'); Stream<List<DataModel>> getDataModelStream() { return usersCol .doc('uid') .collection('data') .orderBy('date', descending: true) .limit(30) .snapshots() .map((list) { return list.docs.map((doc) => DataModel.fromFirestore(doc.data()['dataModel'])).toList(); }); } }
文档添加/更新代码
Future addDataModel(String date, DataModel dataModel) async { await usersCol .doc('uid') .collection('workouts') .doc(date) .set({ 'date': date, 'dataModel': DataModel.toFirestore(dataModel), }); }
当前在通过getDataModelStream监听数据流的同时调用addDataModel,有两个疑问,以下是解答:
问题解答
1. 监听器是否会立即触发,让UI无延迟更新?
首先要注意:你监听的是users/uid/data集合,但更新的是users/uid/workouts集合——这两个是不同集合,当前监听器不会触发。如果是同集合的更新操作,监听器会近乎实时触发:
Firestore的实时监听基于本地缓存+云端同步机制,调用set成功后,本地缓存会立刻更新,监听器会先收到本地缓存的更新事件,UI能瞬间响应;后续云端同步完成后,若有数据冲突才会再次触发修正,但绝大多数场景下用户感知不到延迟,能实现近乎实时的UI更新。
2. 更新已存在的文档时,是否会产生读取操作计费?
会产生读取计费。Firestore的读取计费规则是基于监听器接收的快照内容,不管更新是来自本地缓存还是云端同步,只要监听器触发并返回了文档快照,就会按对应文档数量计读取次数。
另外补充:你的查询设置了limit(30),每次监听器触发时,只会对返回的30条文档计读取次数,而非整个集合的所有文档。
内容的提问来源于stack exchange,提问作者Dalon
相关产品推荐
相关产品推荐

