【问题标题】:Is there a way to tell when a document has been synced with the database from the cache?有没有办法从缓存中判断文档何时与数据库同步?
【发布时间】:2019-08-27 06:43:26
【问题描述】:

我正在构建一个即时通讯应用程序,类似于 WhatsApp,我需要显示消息的发送状态:正在发送,已发送;如果是 Firebase 缓存,由于处于离线状态,则发送,如果消息在在线数据库上,则发送。

有没有办法判断特定文档是否已上传到数据库?

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

这是侦听器的完成块的 sn-p。

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

当缓存或数据库更新时回调运行,但如果一个更新,那么另一个更新然后文档更改被清空。意思是我不知道发生了什么。

任何建议都将不胜感激,在此先感谢。

【问题讨论】:

    标签: ios swift firebase google-cloud-firestore


    【解决方案1】:

    我对此的建议是:

    • 当您从客户端向 Firebase 写入值时,将状态设置为“正在发送” - 无论您是在线还是离线(Firebase 已经为您处理了这个过程,所以不要重新发明它)。
    • 使用您现有的回调通知您与该邮件匹配的新消息,然后您可以在收到这些消息后将其标记为“已发送”(通过回调)。

    为了使这更容易,您甚至可能希望创建一个临时 ID 数组,您希望这些 ID 在写入 Firebase 数据库后会从 Firebase 返回。这将允许您轻松验证发送的消息是否是您期望返回的消息。

    如果这有帮助,请告诉我。

    安德鲁

    【讨论】:

      【解决方案2】:

      您可以在QuerySnapshotSnapshotMetadata 中准确找到该信息,其中有一个isFromCache property

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

      您需要listen for metadata changes 以便在数据同步到服务器后更新 UI。

      【讨论】:

        猜你喜欢
        • 2019-09-30
        • 2013-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-02
        • 1970-01-01
        相关资源
        最近更新 更多