Установка значения для кэшированного изображения заканчивается сбоем

Я загружаю изображение и добавляю его в свой кеш. Это работает нормально, но когда я хочу добавить значение к моему загруженному изображению в кэш, мой код возвращает ошибку Завершение приложения из-за необработанного исключения «NSUnknownKeyException», причина: «[‹NSCache 0x600001cfa3c0› setValue: forUndefinedKey:]: this class не соответствует кодированию значения ключа для ключа 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()
    }

person JPJerry5    schedule 21.06.2020    source источник


Ответы (1)


Ошибка возникает из-за того, что Int не является подклассом NSObject.

Но есть еще две серьезные проблемы.

  1. Кэш объявлен как <NSString, UIImage>, поэтому значение должно быть UIImage, однако day равно Int.
  2. В любом случае нет смысла перезаписывать изображение целым числом

Вы можете добавить значение day к строке URL.

let day = calendar.component(.day, from: date)
let key = "\(url.absoluteString)-\(day)"            
self.cache.setObject(downloadedImage!, forKey: key as NSString)
person vadian    schedule 21.06.2020
comment
О, хорошо, тогда я неправильно понял функцию. Есть ли способ присвоить кэшированному изображению значение, подобное целому? Я пытаюсь сравнить даты загрузки изображений. Спасибо уже! - person JPJerry5; 21.06.2020
comment
NSCache работает как словарь. Он содержит пары ключ-значение одного и того же типа ключа и типа значения. Возможным решением является включение информации о дне в качестве префикса или суффикса строки URL. - person vadian; 21.06.2020
comment
Я думал об этом раньше. Я попробую это тогда. Спасибо. - person JPJerry5; 21.06.2020