首先,请参阅评论中的链接答案。该答案依赖于客户端生成时间戳,并将其写入负面消息并写入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}' –