我正在构建类似于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")")
}
}
当高速缓存或数据库更新时,将运行回调,但是如果一个更新,则其他更新将清空文档更改。意思是我不知道发生了什么。
任何建议将不胜感激,谢谢。
答案 0 :(得分:0)
我对此的建议是:
为简化此操作,您甚至可能希望创建一个ID的临时数组,您希望这些ID一旦写入Firebase DB就会从Firebase返回。这将使您可以轻松地验证发送的邮件是否是您期望返回的邮件。
让我知道这是否有帮助。
安德鲁
答案 1 :(得分:0)
您可以在QuerySnapshot
的{{3}}中找到准确的信息,该信息的SnapshotMetadata
如下:
如果快照是从缓存的数据而不是有保证的最新服务器数据创建的,则返回YES。
一旦数据同步到服务器,您将希望isFromCache
property能够更新UI。