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

Ios Firebase-观察文档的更改-如何知道它们何时来自服务器(完成)?,ios,firebase,google-cloud-firestore,Ios,Firebase,Google Cloud Firestore,我一直在测试和阅读,但都做不好 我已经了解到,对文档的元数据更改不会触发快照侦听器事件,因此无法检查正在获取的文档是否来自缓存。(否则可以通过(documentSnapshot?.metadata.isFromCache)!) 我的问题在于以下几点。用户按下视图控制器a中的按钮后,我将数据设置为Firestore中的文档(我使用随机ID创建一个新文档,并将ID存储在视图控制器a的一个变量中),然后直接转到视图控制器B。在视图控制器B中,我想等待确认我的数据在服务器中 this.db.colle

我一直在测试和阅读,但都做不好

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

我的问题在于以下几点。用户按下视图控制器a中的按钮后,我将数据设置为Firestore中的文档(我使用随机ID创建一个新文档,并将ID存储在视图控制器a的一个变量中),然后直接转到视图控制器B。在视图控制器B中,我想等待确认我的数据在服务器中

 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;
      });
因此,我使用存储在ViewController A中的ID(我将其传入
prepareforsgue:
到ViewController B)进行查询,并检索文档的数据,特别是
状态
字段

我想有两个场景:

1) 显示活动指示器。如果在一段时间后(如20秒)没有文档,则显示错误屏幕以供用户处理(如按钮以重试)

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


问题是它总是进入第二种场景,因为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;
      });

哪种产品?Firestore还是实时数据库?如果事件来自服务器或客户端,为什么会有关系?既然在编写事件时,会收到一个回调,指示事件在服务器上成功的时间,为什么不干脆将它放在服务中,并在视图之间传递服务呢?然后你可以监控服务的完成情况。@Kato,时间安排如何?当过了太多的时间而我还没有完成时?我不知道这意味着什么。如果客户端从未联机,则永远不会完成任何操作。关于那件事没什么可做的。在获得连接之前,您仍然可以在本地显示数据,因为您的写入操作将在本地为侦听器触发。