UICollectionViewCell重用异步图像加载错误的图像

时间:2015-08-05 22:13:19

标签: ios swift amazon-s3 uicollectionview

我正在创建一个UICollectionView,它最初从AWSS3存储桶下载图像,然后缓存图像以供以后访问。问题是,由于下载需要一些时间,当用户滚动UICollectionView时,更多下载排队。第一批下载完成并加载到新显示的单元格中,然后第二批下载完成并替换相同的单元格。

这导致图像出现在不应该出现的单元格中。我尝试过类似帖子的解决方案,但没有找到一个作品。

以下是我尝试过的简化版

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    var cell = self.collectionView.dequeueReusableCellWithReuseIdentifier("imageCell", forIndexPath: indexPath) as! GroupImageCell

    cell.imageView.image = nil

    getPhotoForCell(cell, indexPath)
}

func getPhotoForCell(cell: GroupImageCell, idx: NSIndexPath)
{
    #use AWSS3downloadrequest
    #once results are in
    if (task.result != nil) {
        #get body of result, then url, then data
        let data = NSData(data: task.result.body as! NSURL)

        let image = UIImage(data: data)
        if (collectionView.cellForItemAtIndexPath(idx) != nil)
        {
            dispatch_async(dispatch_get_main_queue(), {
                cell.imageView.image = image
            })
        } 
    }
}

1 个答案:

答案 0 :(得分:3)

您可以通过将图像存储在用于每个单元格的模型对象中来解决此问题。意思是,而不是

dispatch_async(dispatch_get_main_queue(), {
                cell.imageView.image = image
            })

做这样的事情

dispatch_async(dispatch_get_main_queue(), {
                items[indexPath.row].image = image
            })

这样,您可以保证在使用cellForItemAtIndexPath方法调用时呈现正确的图像。

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    var cell = self.collectionView.dequeueReusableCellWithReuseIdentifier("imageCell", forIndexPath: indexPath) as! GroupImageCell

    cell.imageView.image = items[indexPath.row].image
}