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

Ale*_*ini 15 timestamp ios firebase

我有一个使用Firebase的iOS应用程序,目前有一些字典,其中的键是NSDate对象.这个问题的一个明显问题是NSDate从设备的系统时间中抽取,这不是通用的.

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

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

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

小智 29

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

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

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

在Swift中,您可以创建自己的全局时间戳

let kFirebaseServerValueTimestamp = [".sv":"timestamp"]
Run Code Online (Sandbox Code Playgroud)

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

但是您只能将其用作节点的值或优先级.您将无法将其设置为密钥名称(尽管我不相信您也可以在Web API中使用).

通常,调用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);
}];
Run Code Online (Sandbox Code Playgroud)

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


小智 5

警告:似乎时间戳是在您的对象保留在 Firebase 中之后添加的。这意味着,如果您在对象保存的位置设置了.Value事件侦听器,它将被触发两次。一次用于将初始对象存储在该位置,另一次用于添加时间戳。为这个问题苦苦挣扎了好几天:(

对于其他无法弄清楚为什么他们的事件侦听器触发两次/多次的人来说,这是有用的信息!


归档时间:

查看次数:

11132 次

最近记录:

8 年,11 月 前