Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在“集合”视图中从服务器加载图像_Swift - Fatal编程技术网

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
    }            
}