Edw*_*ard 6 ios firebase swift firebase-realtime-database
对于我正在处理的iOS应用程序,我需要按降序获取消息,即最新消息首先出现,然后是第二个最新消息等.
通过查看其他SO答案和研究,似乎我的情况的最佳方法是创建一个负时间戳,然后将其作为消息的额外属性保存到数据库.
然后我将queryOrderedByChild('negativeTimestamp')用于获取a中的消息,然后使用observeSingleEventchildAdded观察器来处理在进行初始调用后发送的消息.
在firebase 文档中,它说我可以从这段代码firebase.database.ServerValue.TIMESTAMP中获取服务器时间戳值.
我如何为Swift 3写这个?
首先,请参阅评论中链接的答案。该答案依赖于客户端生成一个时间戳,该时间戳为负数并写入 Firebase。
如果您想让 Firebase 生成时间戳,也可以使用这个小巧的 Firebase 结构和代码来完成。
首先我们看一下结构
root
parent_node
-Y8j8a8jsjd0adas
time_stamp: -1492030228007
timestamp: 1492030228007
Run Code Online (Sandbox Code Playgroud)
接下来是一些创建和使用该结构的代码:
定义一个我们可以在类中使用的引用 Firebase 时间戳的 var
let kFirebaseServerValueTimestamp = [".sv":"timestamp"]
Run Code Online (Sandbox Code Playgroud)
以及一个将观察者添加到时间戳节点的函数:
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
}
}
})
Run Code Online (Sandbox Code Playgroud)
以及一个写出时间戳的函数,从而导致观察者触发,并根据 Firebase 时间戳在parent_node 内创建子节点
func doTimestamp() {
let timestampRef = self.ref.child("timestamp")
timestampRef.setValue(kFirebaseServerValueTimestamp)
}
Run Code Online (Sandbox Code Playgroud)
这是概要。
在 AttachObserver 函数中,我们将一个观察者附加到时间戳节点 - 该节点可能存在也可能不存在,但如果不存在,它将被创建 - 继续阅读。每当时间戳节点中发生事件时,就会调用闭包中的代码。
当 doTimestamp 函数被调用时,它会创建一个时间戳并将其写入时间戳节点,然后触发我们在 AttachObserver 中附加的观察者。
观察闭包中的代码执行以下操作:
确保快照包含某些内容,如果包含,则增加一个计数器(稍后会详细介绍)。如果计数器大于 1,则从快照中获取整数形式的时间戳。然后,创建它的负数并将其作为parent_node 的子节点写回Firebase。
每当您想要使用 Firebase 生成的时间戳为子节点添加时间戳但反向加载/排序为负值时,这将如何应用 - 这说明了 OP 问题。
这里的问题是当这种情况发生时
timestampRef.setValue(kFirebaseServerValueTimestamp)
Run Code Online (Sandbox Code Playgroud)
它实际上向节点写入两次,这将导致更接近的代码被调用两次。
也许 Firebaser 可以解释这一点,但我们需要忽略第一个事件并捕获第二个事件,这是实际的时间戳。
因此第一个事件将导致观察者更接近射击,使得 count = 1,这将由于 if 语句而被忽略。
然后第二个事件触发,其中包含实际的时间戳,这就是我们用来生成负值并写入 Firebase 的事件。
希望这对OP和评论者有所帮助。
| 归档时间: |
|
| 查看次数: |
913 次 |
| 最近记录: |