当填充collectionView单元格图像不是每次都发生时,从Firebase加载错误的照片

时间:2018-01-29 15:19:59

标签: firebase swift3 uiimageview uicollectionview uicollectionviewcell

我想知道我的代码是否存在问题,因为从Firebase(Firebase中的网址)加载的图像几乎有一半时间不会显示来自Firebase的正确照片。 我从我的collectionView中向您展示了两个截图: - 首先这个案例是加载的正确照片:(在这种情况下没有错误),这就是我想要每次显示的内容

enter image description here

  • 第二个,如果我重新加载视图我可以看到这个图像,在这种情况下你可以看到两张照片是双重的,但是右边的照片应该像第一张图片一样(Firebase没有加载右边的来自存储的图像)

enter image description here

如果我再次重新加载,此问题可能会再次出现或在正确的位置显示正确的照片。 所以我不知道为什么会这个问题。

您可以在这里看到我的codeView的cellRowItemAt函数的代码:

select distinct group_concat(preferred_color)
  from my_table
  group by person_id

我的代码出了什么问题? 谢谢你的帮助。

编辑:我应该在prepareForReuse()函数中写什么:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell
    let photoLive = liveRecent[indexPath.row].photoURL

    self.storageRef.reference(forURL: photoLive!).getData(maxSize: 1 * 1024 * 1024) { (imgData, error) in
        if let error = error {
            let alertView = UIAlertView(title: "Error", message: error.localizedDescription, delegate: nil, cancelButtonTitle: "OK")
            alertView.show()
        } else {
            DispatchQueue.main.async(execute: {
                if let data = imgData {
                    cell.imageViewUn.image = UIImage(data: data)
                }
            })
            DispatchQueue.main.async {
                cell.imageViewUn.reloadInputViews()
            }
        }
    }
    return cell
}

1 个答案:

答案 0 :(得分:0)

问题最有可能发生,因为集合视图单元格中图像的设置与该单元格的生命周期分离。在单元格中设置图像时,您不知道该单元格是否仍然有效,或者是否已将其重新用于其他单元格。您需要能够在重复使用单元格时取消图像加载,或者在单元格索引中存储单元格索引,并在加载图像后检查索引是否已更改。

可以用来捕获单元格重用时的有用函数是

UICollectionReusable.prepareForReuse().

在您的单元格类中覆盖它并添加代码以取消图像加载或以某种方式使其无效。