如何在 Firestore Objective-c 上设置/更新数据时以秒为单位获取 Firebase 服务器时间?

Posted

技术标签:

【中文标题】如何在 Firestore Objective-c 上设置/更新数据时以秒为单位获取 Firebase 服务器时间?【英文标题】:How to get Firebase server time in seconds while set/update data on firestore objective-c? 【发布时间】:2019-04-15 06:34:59 【问题描述】:

在 Firestore 上设置/更新数据时,我们遇到了有关时间戳的问题。我们想要以秒为单位的实际 Firebase 服务器时间戳,但使用 [[FIRTimestamp timestamp].seconds] 为我们提供了以秒为单位的时间戳,但系统日期不是实际的服务器日期。

那么我们如何在设置/更新数据时获取应用程序上的服务器时间戳? 我们也使用[FIRServerValue timestamp],但它以字典格式[".sv":"timestamp"] 给出结果。所以我们尝试通过以下方式从这本字典中获取秒数:

NSLog(@"%ld",(NSInteger)[FIRServerValue timestamp]/1000); //105827998577

但是我们得到的这个时间戳是错误的。

【问题讨论】:

【参考方案1】:

您可以创建自己的全局时间戳

let kFirebaseServerValueTimestamp = [".sv":"timestamp"]

然后你就可以用同样的方式使用kFirebaseServerValueTimestamp了。

但你只能将它用作节点的值或优先级。您将无法将其设置为键名。

一般来说,对字典调用 allKeys 并不能保证顺序。但是,如果您在节点上使用 childByAutoID,则可以通过按字典顺序对 allKeys 返回的 NSArray 进行排序来恢复正确的顺序。这样的事情会起作用:

[ref observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) 
    NSDictionary *value = snapshot.value;
    NSLog(@"Unsorted allKeys: %@", value.allKeys);
    NSArray *sortedAllKeys = [value.allKeys sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"Sorted allKeys: %@", sortedArray);
];

这类似于按字母顺序对 NSArray 进行排序,但在对自动生成的 ID 进行排序时,您不希望进行本地化或不区分大小写的排序,因此您使用 compare: 而不是本地化CaseInsensitiveCompare:

【讨论】:

以上是关于如何在 Firestore Objective-c 上设置/更新数据时以秒为单位获取 Firebase 服务器时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在firestore 9中将具有自定义ID的文档添加到firestore

Firestore / Cloud功能 - 如何在更改时更新Firestore数据

Firestore - 如何在 Kotlin 中排除数据类对象的字段

Vue Firestore 查询。 Firestore更新数据时如何避免重复?

Vue、Vuex 和 Firestore:如何在前端显示检索到的 Firestore 数据并使其具有响应性?

FIRESTORE - 如何在文档中获取集合的值?