我有一个使用Firebase的iOS应用,目前有几个字典,其中的键是NSDate对象。显而易见的问题是NSDate从设备的系统时间中抽取,这不是普遍的。
有了这个,使用Firebase的iOS API获取服务器时间戳(类似于Web API的Firebase.ServerValue.TIMESTAMP)的最佳方法是什么,以便我可以按时间顺序对字典键进行排序?
我也知道childByAutoID生成的ID的时间顺序性质,但我无法弄清楚在代码中对这些ID进行排序的正确方法。虽然它们可能按时间顺序返回,但是任何时候像allKeys这样的东西被调用,顺序就会消失。
对此问题的任何帮助将不胜感激!
答案 0 :(得分:29)
更新:在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中,您可以使用
创建自己的全局时间戳let kFirebaseServerValueTimestamp = [".sv":"timestamp"]
然后您就可以以同样的方式使用kFirebaseServerValueTimestamp
。
但是您只能将其用作节点的值或优先级。您无法将其设置为密钥名称(但我不相信您可以在Web API中使用)。
一般情况下,在字典does not guarantee order.上调用allKeys
但是如果您在某个节点上使用childByAutoID
,则可以通过订购返回的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 alphabetically进行排序,但在对自动生成的ID进行排序时,不需要本地化或不区分大小写的排序,因此您使用compare:
代替localizedCaseInsensitiveCompare:
答案 1 :(得分:3)
从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
}
}
答案 2 :(得分:2)
警告:似乎已添加时间戳 AFTER 您的对象在Firebase中保留。这意味着,如果您在对象持久保存的位置设置了 .Value 事件侦听器,则会触发 TWICE 。一旦初始对象存储在该位置,并再次添加时间戳。这个问题挣扎了几天:(
其他任何无法理解其事件监听器触发两次/多次的人的有用信息!
答案 3 :(得分:2)
您可以使用FIRServerValue.timestamp()获取时间戳。
但是,由于FIRServerValue.timestamp()监听器被调用两次。听众将被召唤两次。