Firebase - 观察对文档的更改 - 如何知道它们何时来自服务器(完整)?

时间:2018-01-05 23:44:09

标签: ios firebase google-cloud-firestore

我一直在测试和阅读,但无法做到正确。

我已经读过,对文档的元数据更改不会触发快照侦听器事件,因此无法检查正在获取的文档是否来自缓存。 (否则可以通过(documentSnapshot?.metadata.isFromCache)!)。

我的问题依赖于以下内容。在用户按下视图控制器A中的按钮后,我将数据设置为Firestore中的文档(我创建一个带有随机ID的新文档并将ID存储在视图控制器A的变量中)并直接转到查看控制器B.控制器B,我想等待确认我的数据在服务器中。

因此,我使用ViewController A(我将prepareForSegue:传递给ViewController B)中存储的ID查询它并检索文档的数据,特别是status字段。

我想有2个场景:

1)显示活动指标。如果在经过一段时间(如20秒)后没有文档,请向用户显示错误屏幕处理它(如按钮再试一次)

2)显示活动指标。检索文档。停止活动指示并正常进行。

问题在于它总是进入第二种情况,因为Firebase首先从本地数据库中获取。 在这种情况下,如何确保我只是收听服务器的更改?

1 个答案:

答案 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;
      });