如何从Firebase的iOS API获取服务器时间戳?

我有一个使用Firebase的iOS应用程序,目前有几个键是NSDate对象的字典。 与此明显的问题是,NSDate从设备的系统时间,这是不通用的。

那么,使用Firebase的iOS API获取服务器时间戳(与Web API的Firebase.ServerValue.TIMESTAMP类似)的最佳方式是什么,以便我可以按照时间顺序对字典键进行sorting?

我也知道由childByAutoID生成的ID的时间顺序性质,但我无法弄清楚在代码中sorting这些代码的正确方法。 虽然他们可能按照时间顺序返回,但任何时候都可以调用像所有键一样的东西,命令就会出来。

任何帮助这个问题将不胜感激!

更新:在Firebase 3.0 + Swift中,您可以使用FIRServerValue.timestamp() 。 在Objective-C中,这是[FIRServerValue timestamp]

在Swift中,您现在可以将FirebaseServerValue.timestamp()与Firebase 2.0.3+(3.0之前)一起使用。

iOS中Firebase.ServerValue.TIMESTAMP的等效值为kFirebaseServerValueTimestamp 。 现在,这只适用于Objective-C而不是Swift。

在Swift中,你可以创build自己的全球时间戳

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

然后你就可以用相同的方法使用kFirebaseServerValueTimestamp

但是您只能将其用作节点的值或优先级。 您将无法将其设置为关键名称(虽然我不相信您也可以在Web API中)。

一般来说,在字典调用allKeys 并不能保证顺序。 但是,如果您在节点上使用childByAutoID ,则可以通过allKeys字典顺序排列allKeys返回的NSArray来allKeys顺序。 像这样的东西可以工作:

 [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进行sorting相似,但sorting自动生成的ID时,不需要进行本地化或不区分大小写sorting,所以使用compare:而不是localizedCaseInsensitiveCompare:

警告:好像时间戳是在您的对象被保存在Firebase后添加的。 这意味着如果你在对象所在位置上设置了一个.Value事件监听器,它将被触发TWICE 。 一次为初始对象被存储在该位置,并再次添加时间戳。 用这个问题挣扎了几天:(

对于无法弄清楚为什么他们的事件监听器触发两次/多次的有用信息!

从Firebase 4.0开始,您可以使用ServerValue.timestamp()

例如:

  let ref = Database.database().reference().child("userExample") let values = ["fullName": "Joe Bloggs", "timestamp": ServerValue.timestamp()] as [String : Any] ref.updateChildValues(values) { (err, ref) in if let err = err { print("failed to upload user data", err) return } } 

您可以使用FIRServerValue.timestamp()获取时间戳。

但是,由于FIRServerValue.timestamp()侦听器被调用了两次。 听众将被称为两次。