如何从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()侦听器被调用了两次。 听众将被称为两次。