【问题标题】:how can I cache an image in swift 5? [duplicate]如何在 swift 5 中缓存图像? [复制]
【发布时间】:2023-03-28 08:35:01
【问题描述】:

我找不到一个很好的例子来说明如何使用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)中这样做?

标签: ios swift caching nscache


【解决方案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 方依赖项。
猜你喜欢
  • 2012-04-09
  • 2017-04-13
  • 2015-12-11
  • 2019-11-02
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
相关资源
最近更新 更多