Кэш для хранения изображения и извлечения из него Кэш не работает - iOS Swift - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь загрузить изображение и сохранить его в кеше.Со следующей попытки вытащите это изображение из кэша, если оно существует, иначе загрузите это изображение

Я прошел через похожие посты, но ничего не помогло мне исправить.

Пожалуйста, совет

    let imageCache = NSCache<NSString, UIImage>()
    func getImage(from url: URL, completion: @escaping ((UIImage?, Error?)->(Void))) {
        if let cachedImage = imageCache.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) {
                self.imageCache.setObject(image, forKey: url.absoluteString as NSString)
                print("Image from cache")
                completion(image, nil)
            }

        }
    }

Когда я вызываю этот метод, он всегда выбирает, загружая изображение.Я поражен здесь

1 Ответ

0 голосов
/ 08 апреля 2019

Создайте общий 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...