如何在 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
,缓存中存储的对象为String
s。你希望它是相反的一个警告:NSCache 不支持 String
作为键类型,它必须是 NSString
:
var imageCache = NSCache<NSString, UIImage>()
这样您就可以将UIImage
s 放入缓存中,同时通过 URL 字符串识别它们。
查看我在 GitHub 上的演示项目:https://github.com/vadimbelyaev/ImagesCache
【讨论】:
我设法找到了一个很好且简单的缓存图像解决方案 - 在 cocopods 上安装翠鸟 是的,有许多库可以进行图像加载和缓存:Kingfisher、SDWebImage、Nuke 等等。但有时您只需要一个简单的解决方案,您可以在一个使用 NSCache 的短类中实现该解决方案,而不是向项目添加相当复杂的 3rd 方依赖项。以上是关于如何在 swift 5 中缓存图像? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中使用 URL 从库中获取图像? [复制]
按下 xcode 7 / Swift 2 时如何更改按钮的图像? [复制]