我目前正在更新我的应用程序,使其与Swift 3兼容,并且还有一个问题需要解决。之前,我的图像缓存非常有效,但自从更新以来,当获取图像时UIImageView
未被填充。
这是代码(在...cellForItemAt...
函数中):
if let img = imageCache[imageUrl] {
print("CACHE HIT: \(indexPath)")
cell.image.image = img
} else {
print("CACHE MISS: \(indexPath)")
var imgUrl: = URL(string: imageUrl)
let request: URLRequest = URLRequest(url: imgUrl!)
let dataTask = session.dataTask(with: request, completionHandler: { (data, response, error) -> Void in
if(data != nil) {
print("IMAGE DOWNLOADED: \(imgUrl?.query))")
let image = UIImage(data: data!) // create the image from the data
self.imageCache[imageUrl] = image // Store in the cache
DispatchQueue.main.async(execute: {
if let cell = collectionView.cellForItem(at: indexPath) as? MyCollectionViewCell {
print("APPLYING IMAGE TO CELL: \(indexPath)")
cell.image.image = image
self.collectionView.reloadData()
} else {
print("CELL NOT FOUND: \(indexPath)")
}
})
}
})
dataTask.resume()
}
正如您所见,我添加了一些
print
来确定发生了什么。当视图加载时,我可以看到缓存未命中,并且图像正在加载以及可见行的UIImageView
被填充,但是当我向下滚动时,UIImageView
从未被填充,并且日志显示对于每个indexPath,“CELL NOT FOUND:[0,x]”。如果我在向下滚动后再向上滚动,则预期会从缓存中填充图像。
代码自上一个版本的Swift / iOS / Xcode以来没有更改,之前完美地工作。
我不关心任何第三方扩展等;我想了解上述代码有什么问题。但是,欢迎提出任何其他的改进/建议。
非常感谢您的任何想法!
[weak self] in
如何帮助? - Ben[weak self]
创建一个会悄悄消失的弱引用。 - Callam[weak self]
替换为[weak collectionView]
,然后您就可以在闭包中使用collectionView?.reloadData()
。 - Callam