Firestore延迟补偿的快照在批处理和事务之间的返回不同

时间:2020-04-04 21:56:18

标签: ios swift google-cloud-firestore

我的批写操作为快照侦听器返回了奇怪的延迟补偿结果。批处理可以完美地在数据库中执行写入操作,并且不会在客户端上产生错误,但是侦听这些文档之一的快照侦听器(在同一应用程序中)将返回奇怪的延迟补偿结果。批次:

example

如果快照侦听器忽略let db = Firestore.firestore() let batch = db.batch() let timestamp = FieldValue.serverTimestamp() batch.updateData([ "private.index.\(someId)": ["count": 0, "timestamp": timestamp] ], forDocument: db.collection("someCollection").document(uId)) batch.deleteDocument(db.collection("anotherCollection").document("\(uId)-\(someId)")) batch.commit { (error) in if let error = error { print(error) } } 的返回值,则数据很好,因为它来自服务器(正确)。但是,如果快照侦听器允许延迟补偿的数据,我会得到:

hasPendingWrites

来自服务器(和事务)的数据如下:

["count": 0, "t": <null>]]

没有理由时间戳为零。

另一个奇怪的是,如果我在事务中执行相同的任务,即使使用延迟补偿的数据也没有问题(这是正确的)。

["count": 0, "t": <FIRTimestamp: seconds=1586033607 nanoseconds=198000000>]]

批处理写入是否有时不能像事务处理那样完全正常工作,因此有时不能给出一致的延迟补偿结果吗?

1 个答案:

答案 0 :(得分:1)

我最近写了一篇有关behavior of server timestamps的博客文章。它与批处理没有任何关系-只是普通的旧文档写入将显示相同的行为。您所看到的实际上是预期的行为。但是事务的行为有所不同,因为本地缓存不涉及事务行为,因为它需要与服务器完全同步才能成功(没有待观察的事务写入)。

如果您绝对需要尚未同步的快照中的时间戳,则应该不带任何参数的getData()来获取快照中的数据。相反,您应该使用getData(serverTimestampBehavior)。您传递的参数:

为尚未设置为其最终值的服务器时间戳配置行为。

通过ServerTimestampBehavior的选项,您可以选择是否要估算,不估算(如现在所见,为零)或该字段的上一个值。听起来像您要估算。