我有一个表格 View ,我想用 firebase 数据填充,还有一个我存储在存储器中的图像。
我最初的游戏计划是运行一个观察者到 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()
所以我希望它的阅读方式是:
转到用户并查看他们的类别。我想发布它的名称,所以我只使用 key 。 key 名称与保存到存储中的图像完全相同,因此我使用该 key 名称从存储中抓取照片。
let pictureRef = DataService.ds.REF_BASE_STORAGE.child(self.currentUserUID).child(String(snap.key))
我将数据库中的数据添加到一个数组,将存储中的图像添加到另一个数组,然后在制作单元格时,我只需将数据设置为数据[indexPath.row],将图像设置为图像[indexPath.row] ].当我执行 images.count 和 data.count 时,我在两者中都有 3 个东西,我的图像落后 3 个,所以我猜这就是我得到 images[indexPath.row] 超出范围错误的地方。
最佳答案
我通常异步加载图像,我有一个委托(delegate)方法,该方法在下载完成时触发,并在下载新数据/图像时刷新表格 View 。
制作一个占位符图像,也许还有一个旋转的加载器图标,在图像下载之前显示会很好。
编辑:
需要在pictureRef.dataWithMaxSize方法中调用self.tableview.reload()。 由于下载是异步的,因此当 REF_USERS.child 方法完成时,您的 tableview 现在将重新加载,而不一定是在下载图像时重新加载。 因此,要么将 self.tableview.reloadData 放在 pictureRef.dataWithMaxSize 的 else 子句中,要么在同一位置创建一个委托(delegate)方法来处理完成的下载图像。
关于ios - 用 firebase 数据库和存储填充 TableView ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38232880/