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

标签 ios firebase google-cloud-firestore

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

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

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

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

我想有两种情况:

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

关于ios - Firebase - 观察文档更改 - 如何知道它们何时来自服务器(完成)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48122830/

相关文章:

java - 将计数器转换为最终数组

ios - 连接到 firebase/firestore 时出错 : Could not reach Cloud Firestore backend

ios - 在 iOS 中发布 UIViewController 的最佳方式是什么

objective-c - Cocos2d : Emitted particles do not pan correctly with screen

ios - 火力地堡存储 : How to Delete Directory

firebase - 如何使用Firestore创建多环境数据库

javascript - Firebase Cloud Function 错误,函数返回未定义、预期 Promise 或值

swift - swift 返回 Firestore 文档 ID 的正确方法是什么?

ios - VoiceOver 读取表格标题两次并始终添加单词 "heading"

iphone - 如何使用 UISlider 以及如何在特定值上设置 slider ?