有没有办法知道何时从缓存中将文档与数据库同步?

时间:2019-04-05 11:09:13

标签: ios swift firebase google-cloud-firestore

我正在构建类似于WhatsApp的即时消息应用程序,并且需要显示消息的发送状态:正在发送,已发送;正在发送消息。如果是Firebase缓存(由于处于脱机状态)则发送邮件,如果消息在联机数据库中则发送邮件。

是否可以判断特定文档是否已上传到数据库?

我目前有一个实时更新侦听器,侦听firestore中的消息集合,当缓存或数据库更新时会触发该消息集合。它可以确定更新来自何处,但是会返回所有消息,并且不指定任何单个文档。

这是侦听器的完成块的摘要。

let source = snapshot.metadata.isFromCache ? "local cache" : "server"

print ("metadata: data fetched from DB: \(source)")

for diff in snapshot.documentChanges {
    print("diffData: \(diff.type.rawValue)")
    print("messageId: \(diff.document.documentID)")
    switch diff.type {
    case .added:
        print("added")
    case .removed:
        print("removed")
    case .modified:
        print("modified")
    }
}

var messages: [ChatEntry] = []
let deletedIds = [String]()
let permanentlyDeletedIds = [String]()

for document in snapshot.documents {
    if document.exists {
         let message = ChatEntry(fromSnapshot: document)
         print("MessageId: \(message?.id ?? "null")")
         print("messageText: \(message?.message ?? "Null")")
    }
}

当高速缓存或数据库更新时,将运行回调,但是如果一个更新,则其他更新将清空文档更改。意思是我不知道发生了什么。

任何建议将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:0)

我对此的建议是:

  • 当您从客户端向Firebase写入值时,将状态设置为“正在发送”-不管您是联机还是脱机(Firebase已经为您处理了此过程,所以不要重新发明它。)
  • 使用现有的回调函数将与之匹配的新消息通知您,您可以在收到新消息后(通过回调函数)将其标记为“已发送”。

为简化此操作,您甚至可能希望创建一个ID的临时数组,您希望这些ID一旦写入Firebase DB就会从Firebase返回。这将使您可以轻松地验证发送的邮件是否是您期望返回的邮件。

让我知道这是否有帮助。

安德鲁

答案 1 :(得分:0)

您可以在QuerySnapshot的{​​{3}}中找到准确的信息,该信息的SnapshotMetadata如下:

  

如果快照是从缓存的数据而不是有保证的最新服务器数据创建的,则返回YES。

一旦数据同步到服务器,您将希望isFromCache property能够更新UI。