繁体   English   中英

用Firebase数据库和存储填充tableview?

[英]Filling a tableview with firebase database and storage?

我有一个表格视图,我想填充Firebase数据以及要存储在存储中的图像。

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

崩溃并烧毁了,因为我想从存储下载图像比提取信息花费的时间更长? 并且images数组的填充速度比数据填充的速度慢,因此导致image [indexPath.row]超出范围时发生崩溃。

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

编辑:

我的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]超出范围错误的地方。

我觉得最好的方法是显示占位符图像,或为从数据库中调用的每个图像加载图标。 随着图像进入,您将相应地更新tableView。

执行此操作的另一种方法是异步运行请求,一旦所有进程完成,就将所有图像一起显示。

您甚至可以显示一个加载屏幕,并在显示tableView之前先加载图像。

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

我通常以异步方式加载图像,并且我有一个委托方法,该方法在下载完成时将触发,并在下载新数据/图像时刷新表格视图。

在下载图像之前,显示占位符图像并可能带有旋转的加载程序图标非常适合显示。

编辑:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM