我在Swift中看到的每个firebase客户端示例似乎都过分简化了从Firebase正确加载数据的过程,现在我已经查看了所有文档和大量代码。我承认我的申请可能有点边缘。
我有一种情况,每次加载视图控制器时,我都想自动将消息发布到房间“嘿,我在这里!”并通过典型的观察呼叫加载服务器上的内容。
我认为流程将是: 1.查看控制器负载 2.自动发布到房间 3.观察childAdded
显然,这些调用是异步的,因此无法保证事情发生的顺序。我试图通过使用完整的处理程序来等待autopost返回来简化操作,但是将自动发布的消息加载到我的tableview中两次。
AutoPoster.sayHi(self.host) { (error) in
let messageQuery = self.messageRef.queryLimited(toLast:25).queryOrdered(byChild: "sentAt")
self.newMessageRefHandle = messageQuery.observe(.childAdded, with: { (snapshot) in
if let dict = snapshot.value as? [String: AnyObject] {
DispatchQueue.main.async {
let m = Message(dict, key: snapshot.key)
if m.mediaType == "text" {
self.messages.append(m)
}
self.collectionView.reloadData()
}
}
})
}
值得注意的是,对于初始加载,这似乎非常低效。我通过使用带有计时器的技巧来解决这个问题,该计时器基本上只允许集合视图每隔0.25秒重新加载一次,并且每次新数据进入时都会重新启动计时器。有点hacky但是我觉得firebase的好处证明了黑客的合理性。
我还试图在初始加载时观察一次值事件,然后才观察到childAdded,但我认为这也有问题,因为无论如何都会调用childAdded。
虽然我很想发布我尝试过的所有加载方法的代码(很高兴用它来更新问题),但我宁愿不调试看起来不起作用的东西,而是让某人帮忙勾勒出这种情况的推荐流程。同样,目标只是自动发布到我加入对话的房间,然后加载初始数据(我的自动发布应该是最新的消息),然后收听传入的新消息。
答案 0 :(得分:0)
而不是
self.newMessageRefHandle = messageQuery.observe(.childAdded, with: { (snapshot) in
尝试替换为
let childref = FIRDatabase.database().reference().child("ChildName")
childref.queryOrdered(byChild:"subChildName").observe(.value, with: { snapshot in