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

时间:2014-08-27 20:41:42

标签: ios timestamp firebase

我有一个使用Firebase的iOS应用,目前有几个字典,其中的键是NSDate对象。显而易见的问题是NSDate从设备的系统时间中抽取,这不是普遍的。

有了这个,使用Firebase的iOS API获取服务器时间戳(类似于Web API的Firebase.ServerValue.TIMESTAMP)的最佳方法是什么,以便我可以按时间顺序对字典键进行排序?

我也知道childByAutoID生成的ID的时间顺序性质,但我无法弄清楚在代码中对这些ID进行排序的正确方法。虽然它们可能按时间顺序返回,但是任何时候像allKeys这样的东西被调用,顺序就会消失。

对此问题的任何帮助将不胜感激!

4 个答案:

答案 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()监听器被调用两次。听众将被召唤两次。