【问题标题】:How to populate Firebase Database data in TableView?如何在 TableView 中填充 Firebase 数据库数据?
【发布时间】:2021-04-27 17:13:19
【问题描述】:

在我的应用程序中,第一个 TableView 显示特定子类别中的广告,用户可以在子类别之间切换,并且 tableview 重新加载并显示相关内容。他们点击一个单元格并被带到一个显示更详细信息的视图控制器。表格视图中的广告按与用户的距离排列。

当我下载整个数据库的应用程序打开时,我通过加载屏幕来实现这一点,计算与用户的距离(对于每个分支,然后找到最近的分支并使用这些坐标),将所有内容附加到一个数组 ["Ad code", "distance in km"] -> ["A1-2-3", 28] 然后我用它来填充表格视图中的单元格并通过计算数组来获取单元格的数量。我真的不喜欢这个解决方案,因为我在打开应用程序时更新数据库会崩溃,有时加载屏幕在下载排序完成之前退出导致 tableview 崩溃。我尝试下载数据然后对其进行排序,但它崩溃了(它试图在填充数组之前开始对数组进行排序)所以我将排序代码移到“Firebase Block”中。

我的问题是,有没有比在打开应用程序时下载整个数据库更好的方法?随着数据库的增长,下载等也会增加。

格式 -> “A0-1-2” - “A0”是类别(1、2、3等),1是子类别,“2”是广告编号。

我的 JSON 树看起来像这样

"Adverts" : {
    "A0" : {
      "A0-0" : {
        "A0-0-0" : {
          "Branches" : [ {
            "Branch Name" : "Florida Road",
            "Latitude" : 1234,
            "Longitude" : 1234
          } ],
          "Images" : {
            "0" : "link",
            "1" : "link",
            "2" : "link",
            "Thumbnail" : "link"
          },
          "Info" : {
            "Name" : "The Barn Owl",
            "Price" : 28.98
          },
          "Social Media" : {
            "Facebook" : "link",
            "Instagram" : "Link",
            "Twitter" : "link",
            "Website" : "link"
          }
        }
      }
    }
  }

【问题讨论】:

  • 我会尽力帮助你,因为这个问题非常模糊,所以很高兴在它关闭之前编辑。首先,我们真的不知道要问什么——你问的是结构还是一些代码(不包括在内)或其他什么?像 a bit glitchy这是正确的方法 之类的第二个陈述完全是主观的 - 你是在寻求有关故障代码的帮助吗?如果是这样,它有什么毛病?或者您当前的用例有什么不正确的地方?最后,SO 用于编码特定问题,而不是关于整体设计。请更新您的问题。
  • 谢谢,我已经更新了我的问题@Jay

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


【解决方案1】:

由于涉及的变量数量众多,这是一个很难准确回答的问题;

您的数据库有多大? 您需要多久执行一次此计算 - 它是事件驱动的吗? 你的预算是多少 总体用例是什么。

但是,它被问得非常频繁,所以让我添加一些数据点。

  1. 数据库大小很重要: 如果您有 100 个用户正在计算距离,那么在应用程序打开并执行距离计算时下载它并没有什么大不了的。但是,如果您有 100,000 个用户,那么,如果您下载整个数据库,不仅会导致用户在下载和计算时体验不佳,还可能会使设备不堪重负并导致其崩溃。它也会影响总成本

  2. 频率很重要: 您访问数据库的频率也像 #1 一样会影响用户体验以及总成本

  3. 你的钱包有多胖: 拉取数据需要花钱,而且大小和频率会影响到这一点

  4. 总体实现和用例是什么: 问题中没有足够的信息来充分评估这一点,因此问题本身可能需要澄清。

有很多方法,但这里有两个

  • 做你正在做的;下载数据,进行计算。如果是少量数据,可能是最好的选择。如果没有,请参阅下一个要点

  • 让 Firebase 服务器完成繁重的工作,只向您的应用提供它感兴趣的数据。例如当您只对 2 英里外的人感兴趣时,为什么还要从 200 英里外的人那里下载数据。

因此,这里的思考过程是对存储在 firebase 中的坐标进行“编码”,以便它们(距离方面)可以进行这样的概念查询

let query = ref.queryOrdered(byChild: "distance").queryStarting(atValue: 0).queryEnding(atValue: 2)

所以...你有一些选择。一种是使用geohashes 制作自己的

另一种方法是使用为您完成工作的预构建库。查看GeoFire。使用 GeoFire,要获取 2 英里半径内的所有用户,请执行以下查询

var circleQuery = geoFire.queryAtLocation(center, withRadius: 2)

您可以让它在用户进入或离开该半径时呈现事件或限制结果的数量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 2016-11-09
    • 2018-11-22
    • 2020-06-06
    • 2011-12-02
    • 2011-03-22
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多