2017-04-04 61 views
5

負火力地堡時間戳對於iOS應用,我的工作,我需要在IE的最新消息降序來獲取信息至上,其次是第二最新消息等如何創建快捷

通過觀察其他所以我回答和研究,似乎我的情況的最佳方法是創建一個負面的時間戳,然後將其作爲消息的額外屬性持久保存到數據庫。

然後,我將使用queryOrderedByChild('negativeTimestamp')獲取observeSingleEvent中的消息,然後讓childAdded觀察者處理一旦進行初始調用就發送的消息。

在火力documentation它說我可以從這個代碼片段firebase.database.ServerValue.TIMESTAMP的

如何我寫這篇文章的斯威夫特3得到服務器的時間戳值?

+0

我敢肯定,裁判由時間戳擺在首位加,所以我不認爲任何排序有存在的必要 –

+0

也就是說,除非你做某種加入 –

+0

另一種解決方案的可能使用'limitToLast',然後在客戶端進行排序。例如。 'messages.sort {$ 0.timestamp> $ 1.timestamp}' –

回答

2

首先,請參閱評論中的鏈接答案。該答案依賴於客戶端生成時間戳,並將其寫入負面消息並寫入Firebase。

如果您想讓Firebase生成一個時間戳,可以使用這個小巧的Firebase結構和代碼片段來完成。

首先,讓我們來看看結構

root 
    parent_node 
    -Y8j8a8jsjd0adas 
     time_stamp: -1492030228007 
    timestamp: 1492030228007 

下,一些代碼來創建和使用該結構的工作:

定義一個變種,我們可以在我們的類中使用引用的火力地堡時間郵票

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

和,增加了觀察者的時間戳節點的函數:

func attachObserver() { 

    let timestampRef = self.ref.child("timestamp") 
    let parentNodeRef = self.ref.child("parent_node") 
    var count = 0 

    timestampRef.observe(.value, with: { snapshot in 

     if snapshot.exists() { 
      count += 1 
      if count > 1 { 
       let ts = snapshot.value as! Int 
       let neg_ts = -ts 
       let childNodeRef = parentNodeRef.childByAutoId() 
       let childRef = childNodeRef.child("time_stamp") 
       childRef.setValue(neg_ts) 
       count = 0 
      } 
     } 
    }) 

這寫出一個時間戳,因此造成觀測到火了基於該火力地堡時間戳

func doTimestamp() { 
    let timestampRef = self.ref.child("timestamp") 
    timestampRef.setValue(kFirebaseServerValueTimestamp) 
} 

的PARENT_NODE內創建子節點這裏的破敗的功能。

在attachObserver函數中,我們將觀察者附加到timestamp節點 - 該節點可能存在也可能不存在,但如果它不存在,則會創建 - 讀取。只要時間戳節點中發生事件,就會調用閉包中的代碼。

當調用doTimestamp函數時,它會創建時間戳並將時間戳寫入時間戳節點,然後觸發我們在attachObserver中附加的觀察者。

在觀察封閉的代碼執行以下操作:

確保快照包含的東西,如果確實如此,遞增計數器(更詳細的介紹了一下)。如果計數器大於1,則從快照中以整數形式獲取時間戳。然後,創建它爲負數,並將其作爲parent_node的子項寫回Firebase。

這是如何應用的,無論何時您想使用Firebase生成的時間戳對子節點進行時間戳記,但是對於反向加載/排序都是負值 - 這與OP問題有關。

的疑難雜症在這裏的是,當這一切發生

timestampRef.setValue(kFirebaseServerValueTimestamp) 

它實際上給節點,這將導致在接近該代碼被調用兩次寫入兩次。

也許一個Firebaser可以解釋,但我們需要忽略第一個事件並捕獲第二個,這是實際的時間戳。

所以第一個事件會導致觀察者更接近火災,count = 1,由於if語句,這將被忽略。

然後第二個事件觸發,其中包含實際的時間戳,這就是我們用於做出否定並寫入Firebase的內容。

希望這有助於OP和評論者。

2

無論是否適用於Swift,另一個概念上的解決方案是依靠Firebase的服務器時間偏移值。

它不像firebase.database.ServerValue.TIMESTAMP那樣精確,但差別通常在幾毫秒內。優點是它可以讓您在客戶端上創建負面時間戳,而無需更新Firebase節點兩次。

您從Firebase需要時獲取服務器時間偏移值,在客戶端上生成負面時間戳,然後將對象保存在Firebase中一次。

請參閱: https://groups.google.com/forum/#!topic/firebase-talk/EXMbZmyGWgE https://firebase.google.com/docs/database/ios/offline-capabilities#clock-skew(適用於iOS)。 https://firebase.google.com/docs/database/web/offline-capabilities#clock-skew(for web)。

var offsetRef = firebase.database().ref(".info/serverTimeOffset"); 
offsetRef.on("value", function(snap) { 
    var offset = snap.val(); 
    var negativeTimestamp = (new Date().getTime() + offset) * -1; 
});