如何在swift中创build负面的Firebase时间戳

对于我正在使用的iOS应用程序,我需要按降序获取消息,即最新的消息先来,然后是第二个最新的消息等。

从看其他SO的答案和研究,似乎我的情况最好的办法是创build一个负面的时间戳,然后坚持到数据库作为消息的额外属性。

然后,我将使用queryOrderedByChild('negativeTimestamp')来获取observeSingleEvent的消息,然后让childAdded观察者来处理初始调用后发送的消息。

在firebase 文档中说,我可以从代码片段firebase.database.ServerValue.TIMESTAMP中获取服务器时间戳值

我如何为Swift 3编写这个?

首先,请参阅评论中的链接答案。 该答案依赖于客户端生成负面的时间戳并写入Firebase。

如果您想让Firebase生成一个时间戳,那么可以使用这个小巧的Firebase结构和代码片段来完成。

首先,我们来看看这个结构

 root parent_node -Y8j8a8jsjd0adas time_stamp: -1492030228007 timestamp: 1492030228007 

接下来,一些代码来创build和使用该结构:

定义一个我们可以在我们的类中使用的引用Firebase时间戳的var

 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 } } }) 

还有一个函数,它写出一个时间戳,因此导致观察者触发,根据Firebase时间戳在parent_node内创build子节点

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

这是破败。

在attachObserver函数中,我们将观察者附加到时间戳记节点 – 该节点可能存在也可能不存在,但是如果不存在,将会创build – 读取。 任何时候在时间戳节点中发生的事件都会调用闭包中的代码。

当doTimestamp函数被调用时,它会创build一个时间戳并写入时间戳记节点,然后触发attachObserver中的观察者。

观察闭包中的代码执行以下操作:

确保快照包含一些东西,如果是的话,增加一个计数器(更多的一点)。 如果计数器大于1,则从快照中以整数forms获取时间戳。 然后,创build它为负数,并将其作为parent_node的子项写回Firebase。

这将如何应用将是任何时候你想要时间戳一个Firebase生成的时间戳的负面价值,但反向加载/sorting的负面价值 – 这与OP问题。

这个问题就是当这种情况发生的时候

  timestampRef.setValue(kFirebaseServerValueTimestamp) 

它实际上会向节点写入两次,这会导致更近的代码被调用两次。

也许一个Firebaser可以解释,但我们需要忽略第一个事件,并捕获第二个,这是实际的时间戳。

所以第一个事件会导致观察者更接近火灾,使计数= 1,由于if语句将被忽略。

然后,第二个事件触发,其中包含实际的时间戳,这就是我们用来做出否定的事情并写入Firebase的内容。

希望这有助于OP和评论者。

无论是否适用于Swift,另一个概念上的解决scheme是依靠Firebase的服务器时间偏移值。

它不像firebase.database.ServerValue.TIMESTAMP那样精确,但差别通常在毫秒之内。 优点是它可以让您在客户端上创build负面的时间戳,而无需更新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 (针对网页)。

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