Swift 在“集合”视图中从服务器加载图像
我已经尝试了很多方法从集合视图中的服务器加载图像,但滚动时仍然存在延迟 这是我的Swift 在“集合”视图中从服务器加载图像,swift,Swift,我已经尝试了很多方法从集合视图中的服务器加载图像,但滚动时仍然存在延迟 这是我的ImageProvider课程: let imageCache = NSCache<AnyObject, AnyObject>() class ImageProvider: UIImageView { var imageUrl: String? func loadImage(from urlString: String) { self.imageUrl = urlSt
ImageProvider
课程:
let imageCache = NSCache<AnyObject, AnyObject>()
class ImageProvider: UIImageView {
var imageUrl: String?
func loadImage(from urlString: String) {
self.imageUrl = urlString
let url = URL(string: urlString)!
image = nil
if let imageFromCache = imageCache.object(forKey: urlString as AnyObject) as? UIImage {
self.image = imageFromCache
return
}
URLSession.shared.dataTask(with: url) { (data, request, error) in
if error != nil {
print(error!)
return
}
DispatchQueue.main.async {
let imageToCache = UIImage(data: data!)
if self.imageUrl == urlString {
self.image = imageToCache
}
imageCache.setObject(imageToCache!, forKey: urlString as AnyObject)
}
}.resume()
}
}
和updateImageView
函数:
func updateImageView() {
self.artwork.loadImage(from: imageUrl)
}
我尝试在collectionView(\uCollectionView:UICollectionView,cellForItemAt indexPath:indexPath)
和collectionView(\uCollectionView:UICollectionView,将显示cell:UICollectionViewCell,forItemAt indexPath:indexPath)
我还使用了SDWebImage
,运气不好
那么我做错了什么?我似乎无法解决问题。据我所知,您不必在主线程上创建UIImage对象。我通常在后台线程中创建UIImage,没有任何问题。但是,UI元素只能在主线程上修改。因此,当您设置UIImageView的image属性时,请确保在主线程上完成了此操作
let imageToCache = UIImage(data: data!)
imageCache.setObject(imageToCache!, forKey: urlString as AnyObject)
DispatchQueue.main.async {
if self.imageUrl == urlString {
self.image = imageToCache
}
}
你想做平滑滚动,对吗?在您获取图像的端点中是否有任何分页?因此我应该在后台执行此部分?是的,请确保在后台线程中创建UIImage,并查看这是否会提高性能。如果您仅在下载新图像时遇到延迟,则这很可能与实际图像的创建时间有关。这意味着在下载并缓存了所有图像之后,性能会得到提高。我刚刚试过。虽然性能提高了一点,但还是一样。你确定滞后与图像有关吗?在配置和重用每个单元时,您是否还做了其他可能导致延迟的事情?
let imageToCache = UIImage(data: data!)
imageCache.setObject(imageToCache!, forKey: urlString as AnyObject)
DispatchQueue.main.async {
if self.imageUrl == urlString {
self.image = imageToCache
}
}