在Firebase和Swift中初始加载列表数据的正确方法是什么?

时间:2017-03-27 23:47:27

标签: ios swift firebase firebase-realtime-database chat

我在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。

虽然我很想发布我尝试过的所有加载方法的代码(很高兴用它来更新问题),但我宁愿不调试看起来不起作用的东西,而是让某人帮忙勾勒出这种情况的推荐流程。同样,目标只是自动发布到我加入对话的房间,然后加载初始数据(我的自动发布应该是最新的消息),然后收听传入的新消息。

1 个答案:

答案 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