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

标签 ios swift firebase firebase-realtime-database chat

我在 Swift 中看到的每个 firebase 客户端示例似乎都过度简化了从 Firebase 正确加载数据,现在我已经查看了所有文档和大量代码。我承认我的申请可能有点边缘情况。

我有这样一种情况,每次加载 View Controller 时,我想自动向房间发布一条消息“嘿,我在这里!”并通过典型的观察调用另外加载服务器上的内容。

我认为流程是: 1.查看 Controller 负载 2.自动发布到房间 3.观察childAdded

显然调用是异步的,所以不能保证事情发生的顺序。我试图通过使用完整的处理程序来等待自动发布返回来简化事情,但这会将自动发布的消息加载到我的 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()
                }
            }
        })
    }

值得注意的是,这对于初始加载来说似乎效率很低。我通过使用一个带有计时器的技巧来解决这个问题,该技巧基本上只允许 Collection View 每 .25 秒重新加载一次最大值,并且每次有新数据进入时都会重新启动计时器。有点 hacky,但我想 firebase 的好处证明了 hack 的合理性。

我还尝试在初始加载时观察值事件一次,然后仅在观察 childAdded 之后才观察,但我认为这也有问题,因为无论如何都会调用 childAdded。

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

最佳答案

代替

self.newMessageRefHandle = messageQuery.observe(.childAdded, with: { (snapshot) in 

尝试替换为

let childref = FIRDatabase.database().reference().child("ChildName")
childref.queryOrdered(byChild:"subChildName").observe(.value, with: { snapshot in

关于ios - 在 Firebase 和 Swift 中初始加载列表数据的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43058281/

相关文章:

ios - Google App Indexing - 如何测试它?

ios tableView clear 颜色分隔符

swift - 快速简单的应用程序总是在模拟器上崩溃

ios - 如何使用#selector 函数传递变量?以及将什么传递给 textField : UITextField?

firebase - 来自 Firebase Analytics 的事件不会显示在 Big Query 中

ios - 将 ios 项目移至 cocoapods, Storyboard在 xcode 中丢失样式

ios - UICollectionViewCell 的 subview 的宽度和高度为零

web-applications - firebase 云消息传递和 firebase 通知之间有什么区别?

angularjs - 当我将 firebase 添加到应用程序依赖项列表时应用程序中断

android - 适用的免费版本是否支持 adMob 或 ChartBoost 广告?