Создайте общий cache
на уровне приложения и добавьте / получите / удалите, где вы хотите, как показано ниже,
class ImageCache {
private init() {}
static let shared = NSCache<NSString, UIImage>()
}
Использование
func getImage(from url: URL, completion: @escaping ((UIImage?, Error?)->(Void))) {
if let cachedImage = ImageCache.shared.object(forKey: url.absoluteString as NSString) {
print("Image from cache")
completion(cachedImage, nil)
}
NetworkOperations().downloadImage(from: url) { (data, error) in
if let error = error {
completion(nil, error)
} else if let imgData = data, let image = UIImage(data: imgData) {
ImageCache.shared.setObject(image, forKey: url.absoluteString as NSString)
print("Image from cache")
completion(image, nil)
}
}
}
Надеюсь, это решит проблему и даст вам представление о том, что не так с вашей реализацией.Скорее всего, ваш кэш имеет ту же область видимости, что и object
, где он объявлен и используется, поэтому, если object
равен de-initialised
, кэш также будет освобожден.
В приведенной выше реализации кэш равенобъявлен как static
, так что он никогда не будет de-initialized
, но вы можете очистить кеш в любое время с помощью следующего:
ImageCache.shared.removeAllObjects()