将值设置为缓存图像以崩溃结束

Posted

技术标签:

【中文标题】将值设置为缓存图像以崩溃结束【英文标题】:Set value to an cached image ends in crash 【发布时间】:2020-06-21 07:53:46 【问题描述】:

我正在下载一张图片并将其添加到我的缓存中。这很好,但是当我想在缓存中为我下载的图像添加一个值时,我的代码返回错误“由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[ setValue:forUndefinedKey:]:此类与键 XXX 的键值编码不兼容。

 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 的子类

但是还有另外两个严重的问题。

    缓存被声明为&lt;NSString, UIImage&gt;,所以值必须是UIImage,但是dayInt。 无论如何用整数覆盖图像是没有意义的

您可以将 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

使用 jQuery 和 AJAX 提交表单如果 return 设置为 false 则不会将值插入 SQL 以防止重定向

如何将值设置为jtable?

我在哪里为我的图像设置缓存信息?

如何将值设置为小于 min 或大于 max 的输入?