2014-08-27 66 views
13

我有一個使用Firebase的iOS應用程序,目前有幾個字典的鍵是NSDate對象。與此明顯的問題是,NSDate從設備的系統時間,這是不通用的。如何從Firebase的iOS API獲取服務器時間戳?

那麼,使用Firebase的iOS API獲取服務器時間戳(類似於Web API的Firebase.ServerValue.TIMESTAMP)的最佳方式是什麼,以便我可以按時間順序對字典鍵進行排序?

我也知道由childByAutoID生成的ID的時間順序性質,但我無法弄清楚在代碼中對這些進行排序的正確方法。雖然他們可能會按照時間順序返回,但任何時候都可以調用類似於所有鍵的命令,命令會跳出窗口。

任何有關這個問題的幫助將不勝感激!

+0

找到這個小工具 - https://github.com/freak4pc/NSDate-ServerDate - 但它如果Firebase爲此提供某種解決方案,我們仍然很高興。 – 2014-08-27 21:33:52

回答

28

更新:在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。

在斯威夫特,你可以用

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

創建自己的全局時間戳,然後你就可以用同樣的方式使用kFirebaseServerValueTimestamp

但是,您只能將此用作節點的值或優先級。您將無法將其設置爲關鍵名稱(儘管我不相信您也可以在Web API中使用)。

一般來說,在字典does not guarantee order.調用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); 
}]; 

這類似於排序的NSArray alphabetically,但排序自動生成的ID時,你要本地化或不區分大小寫的排序,所以你用的compare:代替localizedCaseInsensitiveCompare:

+0

優秀,謝謝! – 2014-08-28 20:20:24

2

警告:好像添加了時間戳AFTER您的對象持久存在於Firebase中。這意味着如果您的對象被設置在您的對象所在的位置上,並且設置了。值,則會觸發TWICE。一次將最初的對象存儲在位置中,並再次添加時間戳。這個問題掙扎了幾天:(

爲別人有用的信息,誰也弄不清爲什麼他們的事件偵聽器多次觸發兩次/!

1

你可以使用FIRServerValue.timestamp時間戳()。

但是,由於FIRServerValue.timestamp()偵聽器被調用了兩次。聽衆將被調用兩次。

2

由於火力地堡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 
     } 

    }