无法将下载的图像插入到Firebase Swift数组中

时间:2018-05-17 08:45:19

标签: arrays swift image firebase firebase-storage

我正在使用Firebase和Swift 4。

图片是从Firebase下载的,但我无法弄清楚如何将下载的图片插入到表格视图的数组中。此代码将相同的图像返回到每个数组中。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? NewsTableViewCell

    let news: NewsList
    news = newsRows[indexPath.row]

    cell?.newsTitle.text = news.title
    cell?.newsDate.text = news.date

    let URL = self.newsImageReference
    print("abc")
    print(URL)
    let storage = Storage.storage()
    let storageRef = storage.reference(forURL: URL)

    storageRef.downloadURL(completion: { (url, error) in
        let data = try! Data(contentsOf: url!)
        let imageDownloaded = UIImage(data: data as Data)
        cell?.newsImg.image = imageDownloaded

        // should be 
        //cell?.newsImg = news.photo

    })

2 个答案:

答案 0 :(得分:0)

只需创建一个数组,例如customImages.append(UIImage(named: "image.png")!)

然后添加let imageDownloaded = UIImage(data: data as Data) customImages.append(imageDownloaded)

cell?.newsImg = customImages[indexPath.row]

in storageRef.downloadURL Closure

然后Object.keys(yourObject)如果你有一个单元格的图像可以单元格吗?.newsImg = customImages [0]

答案 1 :(得分:0)

  1. 首先为您的结构 NewsList 添加另一个属性,作为 imgUrl ,例如标题,日期
  2. 此后,在获取其他Firebase数据时,进行存储引用,并为数据库中的每条记录获取图像URL ,并设置与您的数据库关联的这些URL每个 NewsList实例
  3. 从数据库中获取数据后,只需调用 tableView.reloadData()方法重新加载表视图即可。
  4. 现在,您可以使用 SDWebImage 而不是每次通过创建新的存储参考实例来下载每个图像,它是下载从< strong>远程URLs ,因为它会将下载的图像存储到缓存内存中,因此我们不需要在每次 tableview单元重新加载时都下载图像。因此,如下修改您的 cellForRowAt indexPath:方法:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? NewsTableViewCell
       let news: NewsList
       news = newsRows[indexPath.row]
       cell?.newsTitle.text = news.title
       cell?.newsDate.text = news.date
       let imgURL = news.imgUrl
       cell?.newsImg.sd_setImage(with: imgURL) { (image, error, imgCacheType, url) in
            cell?.newsImg.image = image
       }
    }