【发布时间】:2021-03-15 17:10:34
【问题描述】:
我有一个消息应用程序,我的 Firebase Firestore 数据库中有一个 Chats 集合。我使用一个可编码的自定义对象来读取和写入对 firebase 的更改。
struct ChatFirebaseDO: Codable {
@DocumentID var id: String?
... {100 other fields} ...
var lastMessageDate: Date
}
当用户发送新消息时,我将 lastMessageDate 更新为 FieldValue.serverTimestamp()
我还有一个监听器正在监听更改,它会立即将任何更新返回给我(或者是对现有更新的新聊天)。但是,如果是我自己的用户创建了这个新聊天,它将返回给我,并带有 null 时间戳。
从文档中我看到这是故意行为。它建议我用估计的时间戳值替换空值(完美!)但是,我不知道如何将它与我的自定义对象结合起来。
要获得估计的时间戳,我需要这样做:diff.document.data(with: .estimate)
它返回一个字段字典。
但要让我的Codable 自定义对象起作用,我必须使用:let messageDO = try diff.document.data(as: ChatFirebaseDO.self)
它使用文档(不是数据字典)。
有没有一种方法可以 (1) 用估计的时间戳替换空值,但 (2) 仍然有一个文档对象可用于我的自定义对象转换。
也许我可以使用估计值进行全局设置,或者在单个侦听器请求中进行本地设置。或者也许它是一种使用数据字典中的自定义对象的方法,而不仅仅是来自FIRDocument。
提前谢谢你!
【问题讨论】:
-
Firestore 不谈,是否要求您的结构为
Codable? -
不是必需的,但它非常有用,并且在我的项目架构中是“家具的一部分”。仅仅因为 Firebase 的一个空时间戳而丢失它会很可惜。
标签: swift firebase google-cloud-firestore timestamp codable