Swift 4 - 如何使用缓存加载图像?

Posted

技术标签:

【中文标题】Swift 4 - 如何使用缓存加载图像?【英文标题】:Swift 4 - How To load images using cache? 【发布时间】:2018-12-23 11:23:48 【问题描述】:

我有 UIImageView,如果存在我想下载缓存中的图像,我使用了扩展 func。

我有这段代码,但不工作:

extension UIImageView 
    func loadImageUsingCache (_ urlString : String) 
        let imageCache = NSCache<AnyObject, AnyObject>()
        if let cachedImage = imageCache.object(forKey: urlString as AnyObject) 
            self.image = cachedImage as? UIImage
            return
        
        let url = URL(string: urlString)
        URLSession.shared.dataTask(with: url!)  (data, response, error) in
            if data != nil 
                if let image = UIImage(data: data!) 
                    imageCache.setObject(image, forKey: urlString as AnyObject)
                    DispatchQueue.main.async(execute: 
                        self.image = image
                    )
                
            
        .resume()
    

【问题讨论】:

请解释一下不起作用。你的代码没有编译?或者导致运行时错误?如果你得到错误,在哪一行和什么样的消息?或者它运行没有任何问题,但你得到了意想不到的结果?解释所有这些事情。 【参考方案1】:

您正在为每个图像创建新的 NSCache 对象,而不是保留它。 您应该创建对象变量而不是本地变量。在这种情况下,它在扩展中不起作用。您也可以尝试改用 URLCache.shared。

【讨论】:

【参考方案2】:

// 这是完美的解决方案 //

var imageCache = String: UIImage

类 CustomImageView: UIImageView

var lastImgUrlUsedToLoadImage: String?

func loadImage(with urlString: String) 

    // set image to nil
    self.image = nil

    // set lastImgUrlUsedToLoadImage
    lastImgUrlUsedToLoadImage = urlString

    // check if image exists in cache
    if let cachedImage = imageCache[urlString] 
        self.image = cachedImage
        return
    

    // url for image location
    guard let url = URL(string: urlString) else  return 

    // fetch contents of URL
    URLSession.shared.dataTask(with: url)  (data, response, error) in

        // handle error
        if let error = error 
            print("Failed to load image with error", error.localizedDescription)
        

        if self.lastImgUrlUsedToLoadImage != url.absoluteString 
            return
        

        // image data
        guard let imageData = data else  return 

        // create image using image data
        let photoImage = UIImage(data: imageData)

        // set key and value for image cache
        imageCache[url.absoluteString] = photoImage

        // set image
        DispatchQueue.main.async 
            self.image = photoImage
        
        .resume()

【讨论】:

以上是关于Swift 4 - 如何使用缓存加载图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 5 中缓存图像? [复制]

如何使用 UIImageViewExtension 与 Swift 异步加载图像并防止重复图像或错误图像加载到单元格

如何使用 Swift 3 将图像从 Rest Api 加载到视图中加载方法

如何使用 swift 将 Images.xcassets 中的图像加载到 UIImage 中

如何使用 swift 将 Images.xcassets 中的图像加载到 UIImage 中

SDWebImage - 如何从缓存加载图像?