【发布时间】: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