2017-04-04 62 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; 
});