【问题标题】:Filling a tableview with firebase database and storage?用firebase数据库和存储填充tableview?
【发布时间】:2016-11-09 00:41:36
【问题描述】:

我有一个要填充 firebase 数据的 tableview 以及一个存储在存储中的图像。

我最初的游戏计划是对 firebase 运行一个观察者,并为快照中的每个项目填充一个 firebase 数据数组,并从具有相同快照名称的存储中提取数据,并将其放入另一个匹配的数组中,并且然后在我的单元格中,我会用图像数组的 indexpath.row 和数据数组中的数据填充图像,它会匹配并且很酷。

这次崩溃和烧毁是因为我猜从存储中下载图像比提取信息花费的时间更长?并且图像数组的填充速度比数据慢,所以我遇到了图像 [indexPath.row] 超出范围的崩溃。

用数据库和存储中的数据填充 tableview 的正确方法是什么?

编辑:

我的 firebase 数据如下所示:

users
  02938409283049829304
    Category
        Cats : true
        Dogs:  true

这就是我想要做的:

REF_USERS.child(currentUserUID).child("Category").observeEventType(.Value) { ( snapshot: FIRDataSnapshot) in

        self.categoriesArray = []
        self.imagesArray = []

        if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {
            for snap in snapshots {


                self.categoryArray.append(snap.key)


                let pictureRef = DataService.ds.REF_BASE_STORAGE.child(self.currentUserUID).child(String(snap.key))

                pictureRef.dataWithMaxSize(9809898999098098 /* no idea what to put here*/) { (data, error) -> Void in
                    if (error != nil) {
                        print(error)  

                    } else {
                         let picture : UIImage! = UIImage(data: data!)

                       self.imagesArray.append(picture)

                        print(self.imagesArray.count)

                    }
                }


self.tableView.reloadData()

所以我希望它读起来是:

转到用户并查看他们的类别。我正在寻找发布它的名称,所以我只使用密钥。键名与保存到存储时的图像完全相同,因此我使用该键名从存储中获取照片。

 let pictureRef = DataService.ds.REF_BASE_STORAGE.child(self.currentUserUID).child(String(snap.key))

我将数据库中的数据添加到一个数组中,将存储中的图像添加到另一个数组中,然后当我制作单元格时,我只需将数据设置为 data[indexPath.row] 并将图像设置为 images[indexPath.row ]。当我执行 images.count 和 data.count 并且两者都有 3 件事时,我的图像落后了 3 个,所以我猜这就是我得到 images[indexPath.row] 超出范围错误的地方。

【问题讨论】:

  • 确实没有正确的方法;有几条路要走。很大程度上取决于您的数据和图像的 Firebase 结构。您可以将其作为文本包含在您的问题中吗?
  • @Jay 是的,它现在就在那里。我不知道我这样做是否离谱。我一次只会向用户展示最多 10 张照片,所以我想我可能不需要处理缓存?任何指导表示赞赏,谢谢。

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


【解决方案1】:

我通常异步加载图像,我有一个在下载完成时触发的委托方法,并在下载新数据/图像时刷新 tableview。

制作一个占位符图像并可能带有一个旋转的加载器图标会很好地在图像下载之前显示。

编辑:

你需要在pictureRef.dataWithMaxSize方法中调用self.tableview.reload()。 由于下载是异步的,您的 tableview 现在将在方法 REF_USERS.child 完成时重新加载,而不一定在下载图像时重新加载。 因此,要么将 self.tableview.reloadData 放在 pictureRef.dataWithMaxSize 的 else 子句中,要么在同一位置创建一个委托方法来处理完成的下载图像。

【讨论】:

  • 感谢您的编辑。如果我无法弄清楚,我会搞砸这个并回来发表评论,但你的编辑成功了。非常感谢,不胜感激。
  • 最后一个快速问题。通过我的代码设置 atm 的方式,每次发布新帖子时,我猜图片正在重新下载,因此必须重新填充整个表格视图,因此它看起来非常缓慢且笨拙,而只是自己添加了一个新帖子。这是缓存进来的地方吗? (以前从未这样做过)或者我可以只调用一个初始的 .Value 观察者然后用户一个 .childAdded?你会如何解决这个问题?
  • 每次下载一张图片都不能填满整个tableview。当您有一组数据来填充 tableview 调用 .reload。当您需要添加项目时,例如异步下载的图像或其他需要稍后添加的项目,最好只在行中插入项目,而不是一遍又一遍地填充表格视图。但是您应该始终将您的项目/数据添加到 tableview 数组中,因为系统可能会自行刷新 tableview。
【解决方案2】:

我认为最好的方法是显示占位符图像,或者为您从数据库调用的每个图像显示一个加载图标。随着图像的出现,您相应地更新 tableView。

您可以这样做的另一种方法是异步运行请求,一旦所有进程完成,您就会将所有图像一起显示。

您甚至可以在显示 tableView 之前显示加载屏幕并让图像加载。

您所要做的就是在开始将图像添加到 tableView 之前确保图像存在,并确保内存使用不会过度。

【讨论】:

  • 感谢您的帮助,我可能最终会使用每个人的答案的混合搭配。感谢帮助
猜你喜欢
  • 2018-11-22
  • 1970-01-01
  • 2020-06-06
  • 2021-04-27
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多