Swift Firebase-将估计的ServerTimestamp与可编码的自定义对象相结合



我有一个消息应用程序,在Firebase Firestore数据库中有一个Chats集合。我使用了一个自定义对象,它是可编码的,可以读取和写入对firebase的更改。

struct ChatFirebaseDO: Codable {
@DocumentID var id: String?

... {100 other fields} ...

var lastMessageDate: Date
}

当用户发送新消息时,我用FieldValue.serverTimestamp()更新此lastMessageDate

我还有一个侦听器,它正在侦听更改,它会立即向我返回任何更新(wnether是对现有更新的新聊天(。但是,如果是我自己的用户创建了这个新聊天,它将返回给我一个null时间戳。

从医生那里我看到这是故意的行为。它建议我用估计的时间戳值来替换null(完美!(然而,我不知道如何将其与我的自定义对象相结合。

为了获得估计的时间戳,我需要这样做:
diff.document.data(with: .estimate)
它返回一个字段字典。

但为了使Codable自定义对象工作,我必须使用:
let messageDO = try diff.document.data(as: ChatFirebaseDO.self)
,它使用文档(而不是数据字典(。

有没有一种方法可以(1(用估计的时间戳替换null,但(2(仍然有一个文档对象可以用于自定义对象转换

也许这是一个全局设置,我可以使用估计,或者在单个侦听器请求中进行本地设置。或者,这可能是一种使用数据字典中的自定义对象的方式,而不仅仅是来自FIRDocument

提前谢谢!

如果您没有为磁盘存储对这些聊天进行编码,那么为什么它们甚至是Codable,这是一个需要问自己的问题。这个特殊的方法就是为了这个目的而设计的,所以我认为你在工作中使用了错误的工具——由于时间戳冲突,这个工具也不起作用,我想这将在Firestore的未来更新中得到解决。

也就是说,时间戳(是令牌(只有在尚未到达服务器时才返回nil,这意味着只能从客户端生成的延迟补偿快照中返回(或者只有在登录用户发布时(。因此,当值为nil(将是当前日期和时间(时,您可以提供自己的估计,这不仅是准确的,而且当它具有真实值时,无论如何都会被后续快照覆盖。这不是一个令人愉快的变通方法,但它完全实现了代币自己估计的功能。

如果你不想放弃Codable,那么你可以放弃Firestore的时间戳,这是我个人做的。我不喜欢令牌系统,我已经用一个基本的Unix时间戳(一个整数(取代了它,这让事情变得更简单。我不必担心nil次、延迟补偿返回或配置快照数据来处理单个字段的值。如果非要我猜测的话,我想Firestore最终除了扩展API以允许Codable方法也考虑时间戳行为之外,还将允许时间戳行为的全局设置。不幸的是,它的TLDR是,你想要的东西在Firestore SDK中还不存在,我会考虑将其作为Firestore iOS git repo上的一个功能请求。

最新更新