2016-07-06 44 views
0

我有一个桌面视图,我想填充firebase数据,也是我存储在存储中的图像。用Firebase数据库和存储填充tableview?

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

这次崩溃和烧毁是因为从存储下载图像我想花费的时间比拉动信息长?和图像数组被填充比数据慢,所以我得到一个崩溃,图像[indexPath.row]超出范围。

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

编辑:

我的火力点的数据是这样的:

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)) 

我从数据库中的阵列和从存储到另一个阵列将图像添加数据,然后当我使细胞我只设置数据,以将图像数据[indexPath.row]和图像[indexPath.row]。当我做images.count和data.count,并且我有两件事情时,我的图片落后3,所以这就是我得到的图像[indexPath.row]超出范围错误我猜。

+0

确实没有一个正确的方法;有几条路要走。这很大程度上取决于您的Firebase结构中的数据和图像。你可以将它作为文本包含在你的问题中吗? – Jay

+0

@Jay Yep它现在在那里。我不知道我是不是这样做的基础。我只会一次向用户显示最多10张照片,所以我想我可能不需要处理缓存?任何指导表示赞赏,谢谢你。 – Noowoo

回答

1

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

制作一个占位符图像,也许使用旋转加载器图标将很好显示在图像下载之前。

编辑:

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

+0

感谢您的编辑。如果我无法弄清楚,但是你的编辑做了这个诀窍,会不会想到这件事,然后回来评论。非常感谢,感谢。 – Noowoo

+0

只是最后一个简短的问题。随着我的代码设置atm的方式,每次一个新的职位,我猜图片正在redownloaded,所以整个表格必须重新填充,所以它是非常缓慢和笨重的看,而只是一个新的职位自己添加。 这是缓存进来吗? (之前从未做过),或者我可以调用一个初始的.Value观察者,然后用户.childAdded?你将如何解决? – Noowoo

+0

每次下载图像时填充整个tableview都不太好。当你有一组数据来填充tableview调用.reload。当您需要添加项目(例如下载的异步图像)或其他需要稍后添加的项目时,最好在行中插入项目,而不是反复填充表格视图。但是你应该总是把你的项目/数据添加到tableview数组中,因为系统可以自己刷新tableview。 – Starlord

1

我觉得你可以做到这一点的最佳方式是显示占位符图像,或者是从数据库调用每个图像的加载图标。随着图像进入,您相应地更新tableView。

另一种可以做到这一点的方式是异步运行请求,并且只要所有进程完成,就可以将所有图像一起显示。

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

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

+0

感谢您的帮助,我可能会最终使用每个人的答案混合和匹配。欣赏帮助 – Noowoo

相关问题