[英]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.