gpt4 book ai didi

ios - swift 3 : Caching images in a collectionView

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:31 26 4
gpt4 key购买 nike

我目前正在研究我的应用程序,更新它以使用 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 以了解发生了什么。当 View 加载时,我可以看到缓存未命中、图像加载和 UIImageView 正在为可见行填充,但是当我向下滚动时,UIImageView 是从未填充,日志显示每个 indexPath 的 CELL NOT FOUND: [0, x]

如果我在向下滚动后再次向上滚动,图像会按预期从缓存中填充。

自上一版本的 Swift/iOS/Xcode 以来,代码没有改变,并且曾经完美地工作。

我对任何第 3 方扩展等不感兴趣;我想了解上面的代码有什么问题。但是,欢迎对代码提出任何其他改进/建议。

任何想法将不胜感激!

最佳答案

与其通过 cellForItem(at: indexPath) 方法获取单元格,不如使用您用来在缓存命中中设置图像的 cell 变量。这将创建对单元格 ImageView 的强引用。

DispatchQueue.main.async(execute: { [weak collectionView] in
cell.image.image = image
collectionView?.reloadData()
})

考虑将 UIImageView 重命名为 imageView 而不是 image

关于ios - swift 3 : Caching images in a collectionView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39561572/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com