Fat*_*tie 0 ios firebase swift google-cloud-firestore
使用 Firestore,我添加了这样的时间戳字段
var ref: DocumentReference? = nil
ref = Firestore.firestore()
.collection("something")
.addDocument(data: [
"name": name,
"words": words,
"created": Timestamp(date: Date())
]) { ...
let theNewId = ref!.documentID
...
}
Run Code Online (Sandbox Code Playgroud)
这很好,效果很好,但它并不真正正确。应该使用 Firestore 提供的“服务器时间戳”。
请注意,这是在 iOS (Swift) 和 Firestore 上,而不是 Firebase。
获取服务器时间戳的语法是什么?
您正在寻找的语法是:
"created": FieldValue.serverTimestamp()
Run Code Online (Sandbox Code Playgroud)
这会创建一个本身没有日期值的令牌。该值是在实际写入此写入时由服务器分配的。写时间戳很简单。
阅读它们有点不那么直接。当您阅读包含它们的文档时,您需要配置它们的处理方式。
doc.get("created", serverTimestampBehavior: .none)
doc.get("created", serverTimestampBehavior: .previous)
doc.get("created", serverTimestampBehavior: .estimate)
Run Code Online (Sandbox Code Playgroud)
nonenil如果服务器尚未设置该值,则实际上会给您一个值。例如,如果您正在编写依赖于延迟补偿回报的文档,您将获得nil(在该延迟补偿回报上)。当服务器最终执行写入并设置值时,它将不再是nil。
previous 会给你任何以前的值,如果它们存在的话。
estimate会给你一个价值,但这将是对价值可能的估计。例如,如果您正在编写依赖于延迟补偿返回的文档,estimate即使服务器尚未设置其值,也会为您提供该延迟补偿返回的日期值。
正是出于这些原因,处理 Firestore 的时间戳可能会导致您的快照侦听器返回更多(用于更新令牌的返回)。代币世界的 Swift 替代方案是使用没有任何这些复杂性的 Unix 时间戳:
extension Date {
var unixTimestamp: Int {
return Int(self.timeIntervalSince1970 * 1_000) // millisecond precision
}
}
"created": Date().unixTimestamp
Run Code Online (Sandbox Code Playgroud)
这绝对是时间戳如何工作的最佳解释(由实际发布答案的同一道格史蒂文森撰写):https : //medium.com/firebase-developers/the-secrets-of-firestore-fieldvalue-servertimestamp-revealed -29dd7a38a82b
| 归档时间: |
|
| 查看次数: |
854 次 |
| 最近记录: |