将值设置为缓存图像以崩溃结束
Posted
技术标签:
【中文标题】将值设置为缓存图像以崩溃结束【英文标题】:Set value to an cached image ends in crash 【发布时间】:2020-06-21 07:53:46 【问题描述】:我正在下载一张图片并将其添加到我的缓存中。这很好,但是当我想在缓存中为我下载的图像添加一个值时,我的代码返回错误“由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[
let cache = NSCache<NSString, UIImage>()
func downloadImage(withURL url:URL, completion: @escaping (_ image:UIImage?)->())
let dataTask = URLSession.shared.dataTask(with: url) data, responseURL, error in
var downloadedImage:UIImage?
if let data = data
downloadedImage = UIImage(data: data)
print("downloadedImage")
DispatchQueue.main.async
completion(downloadedImage)
if downloadedImage != nil
let date = Date() // calling the date
var calendar = Calendar.current // calling the calendar
if let timeZone = TimeZone(identifier: "GMT-4")
calendar.timeZone = timeZone
let day = calendar.component(.day, from: date)
self.cache.setObject(downloadedImage!, forKey: url.absoluteString as NSString)
self.cache.setValue(day, forKey: url.absoluteString) // this line runs into an error
dataTask.resume()
【问题讨论】:
【参考方案1】:发生错误是因为Int
不是NSObject
的子类
但是还有另外两个严重的问题。
-
缓存被声明为
<NSString, UIImage>
,所以值必须是UIImage
,但是day
是Int
。
无论如何用整数覆盖图像是没有意义的
您可以将 day
值附加到 URL 字符串
let day = calendar.component(.day, from: date)
let key = "\(url.absoluteString)-\(day)"
self.cache.setObject(downloadedImage!, forKey: key as NSString)
【讨论】:
哦,好吧,那我误解了这个功能。有没有办法为缓存的图像分配一个像整数这样的值?我正在尝试比较图像下载的日期。已经谢谢你了!NSCache
就像字典一样工作。它保存相同键类型和值类型的键值对。一种可能的解决方案是包含日期信息作为 URL 字符串的前缀或后缀
我之前也想过。那我会试试的。谢谢。以上是关于将值设置为缓存图像以崩溃结束的主要内容,如果未能解决你的问题,请参考以下文章
将值从选择器视图设置为文本字段,而无需以编程方式全局快速声明 uitextfield