首先,請參閱評論中的鏈接答案。該答案依賴於客戶端生成時間戳,並將其寫入負面消息並寫入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和評論者。
我敢肯定,裁判由時間戳擺在首位加,所以我不認爲任何排序有存在的必要 –
也就是說,除非你做某種加入 –
另一種解決方案的可能使用'limitToLast',然後在客戶端進行排序。例如。 'messages.sort {$ 0.timestamp> $ 1.timestamp}' –