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

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

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

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

我想有两种情况:

1)显示 Activity 指示器。如果在20秒钟后仍没有文档,请显示错误屏幕以供用户处理(如按钮再试一次)

2)显示 Activity 指示器。检索文档。停止 Activity 指示灯并正常进行。

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

最佳答案

您可以在查询中使用选项 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;
      });

08-27 19:00
查看更多