我一直在测试和阅读,但无法做到正确。
我已经读过,对文档的元数据更改不会触发快照侦听器事件,因此无法检查正在获取的文档是否来自缓存。 (否则可以通过(documentSnapshot?.metadata.isFromCache)!
)。
我的问题依赖于以下内容。在用户按下视图控制器A中的按钮后,我将数据设置为Firestore中的文档(我创建一个带有随机ID的新文档并将ID存储在视图控制器A的变量中)并直接转到查看控制器B.控制器B,我想等待确认我的数据在服务器中。
因此,我使用ViewController A(我将prepareForSegue:
传递给ViewController B)中存储的ID查询它并检索文档的数据,特别是status
字段。
我想有2个场景:
1)显示活动指标。如果在经过一段时间(如20秒)后没有文档,请向用户显示错误屏幕处理它(如按钮再试一次)
2)显示活动指标。检索文档。停止活动指示并正常进行。
问题在于它总是进入第二种情况,因为Firebase首先从本地数据库中获取。 在这种情况下,如何确保我只是收听服务器的更改?
答案 0 :(得分:1)
您可以在查询中使用 includeDocumentMetadataChanges 选项,并使用属性 hasPendingWrites 创建if语句,以仅获取服务器上的数据。
下面是一个示例,我只使用已在服务器中写入的数据更新用户数组。
this.db.collection('users')
.onSnapshot({ includeDocumentMetadataChanges: true }, function (doc) {
var result = [];
doc.docs.forEach(element => {
if (!element.metadata.hasPendingWrites) {
result.push(element.data())
}
});
return result;
});