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

Posted

技术标签:

【中文标题】如何在 swift 5 中缓存图像? [复制]【英文标题】:how can I cache an image in swift 5? [duplicate] 【发布时间】:2021-11-18 15:08:16 【问题描述】:

我找不到一个很好的例子来说明如何使用URLSession 在表格视图中缓存图像以从互联网 (API) 获取图像。

但是,我遇到了缓存问题 - 这是我目前的代码:

func configure(with urlString: String, name: String, address: String, station: String) 
    
    var imageCache = NSCache<UIImage, String>()
    
    loader.startAnimating()
    loader.isHidden = false
    
    guard let url = URL(string: urlString) else 
        return
    
    
    let task = URLSession.shared.dataTask(with: url)  [weak self] data, _, error in
        guard let data = data, error == nil else 
            return
        
        
        let locationImage = UIImage(data: data)
        
        imageCache.setObject(locationImage!, forKey: urlString)
        
        imageCache[url] = locationImage
        
        DispatchQueue.main.async 
            self?.nameLabel.text = name
            self?.addressLabel.text = address
            self?.locationImageView.image = locationImage
            self?.loader.stopAnimating()
            self?.loader.isHidden = true
        
    
    task.resume()

错误包括:

无法将“String”类型的值转换为预期的参数类型“UIImage” 'NSCache' 类型的值没有下标 'NSCache' 要求 'String' 是类类型

【问题讨论】:

另外,如果configure 方法是表格视图单元类的一部分,那么您没有在适当的位置实例化缓存。而且您还应该注意 http 请求,因为您不希望最终出现重复使用的单元格被错误单元格中的内容填充的情况。 是的,这也是我遇到的问题 - 我的单元格中的内容不正确 - 我该如何解决这个问题?应该在哪里实例化缓存? 我把它移到了配置方法之外是这样的吗?或者我应该直接在方法@cristik的单元格(cellforrow)中这样做? 【参考方案1】:

声明

var imageCache = NSCache<UIImage, String>()

创建一个缓存,其中键类型为UIImage,缓存中存储的对象为Strings。你希望它是相反的一个警告:NSCache 不支持 String 作为键类型,它必须是 NSString

var imageCache = NSCache<NSString, UIImage>()

这样您就可以将UIImages 放入缓存中,同时通过 URL 字符串识别它们。

查看我在 GitHub 上的演示项目:https://github.com/vadimbelyaev/ImagesCache

【讨论】:

我设法找到了一个很好且简单的缓存图像解决方案 - 在 cocopods 上安装翠鸟 是的,有许多库可以进行图像加载和缓存:Kingfisher、SDWebImage、Nuke 等等。但有时您只需要一个简单的解决方案,您可以在一个使用 NSCache 的短类中实现该解决方案,而不是向项目添加相当复杂的 3rd 方依赖项。

以上是关于如何在 swift 5 中缓存图像? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 Swift 中使用 URL 从库中获取图像? [复制]

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

按下 xcode 7 / Swift 2 时如何更改按钮的图像? [复制]

如何获取在 Flutter 中使用图像选择器插件选择的图像的原始路径,而不是复制到缓存?

如何在 Swift 3 中从 Base64 编码的字符串创建图像? [复制]