在CollectionView中滚动时,应用程序冻结了

时间:2018-03-18 08:15:34

标签: swift caching uicollectionview kingfisher

在CollectionView中我加载图片以及 FlurryAds 。即使应用处于离线状态,我也需要显示图像,因此最初我使用 KingFisher 下载图像并存储在缓存中,显示活动加载器,直到所有图像都下载完毕。

这是我用来下载图像并将其存储在缓存中的代码,

 KingfisherManager.shared.retrieveImage(with: URL(string: imageUrl)!, options: [], progressBlock: nil) {
                (image, error, url, data) in
                if let _ = image {
 }
}

使用 KingFisher 将图像加载到collectionView Cell中。

func setImageFromCache(url: String) {
        let url = URL(string: String(format: "%@", url))
        self.kf.setImage(with: url)
    }

问题是当所有图像都被下载到缓存中并且我导航以在集合视图中查看图像时,所有图像都会显示,但有时当我快速滚动或滚动时,然后突然回到之前的屏幕应用程序得到了冻结并且必须强制关闭应用程序。

1 个答案:

答案 0 :(得分:2)

这是因为您在块中强引用self,当您滚动得太快,并且所有回调尚未执行时,一旦视图控制器被解除,它就会被释放,因此self该块内的指针捕获将是一个狂野指针。然后块执行它,崩溃。

尝试使用[弱自我]来捕获该块中的自我