NSCache, Image Cache, не кешируется (Xcode 11, Swift 5) - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь загрузить кэшированное изображение. При нажатии кнопки я либо отображаю изображение, если оно кэшируется, либо загружает его, затем сохраняет в кэш. При первом щелчке я получаю ярлык с надписью «Загрузить из Интернета», а при втором щелчке он загружается из кеша, когда я получаю «Загружен из кеша»

Однако при перезапуске приложения я снова получаю оба ярлыка Как будто изображение на самом деле не кешируется, «Загрузка из Интернета» при первом клике и «загрузка из кеша» при любом клике после этого.

    let imageCache = NSCache<AnyObject, AnyObject>()



    @IBAction func Button(_ sender: Any)//download charts
    {
    let imageUrl = URL(string: "https://www.vedur.is/photos/flugkort/PGDE14_EGRR_0000.png")

    if let imageFromCache = imageCache.object(forKey: imageUrl as AnyObject) as? UIImage {
        self.Image1.image = imageFromCache
        self.Image2.text = "Loaded from cache"
        return
    }

    URLSession.shared.dataTask(with: imageUrl!) { data, response, error in
        if let data = data { DispatchQueue.main.async
            {
                let imageToCache = UIImage(data: data)
                imageCache.setObject(imageToCache!, forKey: imageUrl as AnyObject)
                self.Image1.image = imageToCache
                self.Image2.text = "Downloaded From Web"
            }

        }
    }.resume()
}

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

Однако, когда я перезапускаю приложение, я снова получаю обе метки, как будто изображение фактически не кешируется

Это потому, что NSCache - это кэш памяти, а не диск кэш. Вещи, которые вы добавляете в экземпляр NSCache, не сохраняются при перезапуске. Если вы хотите избежать загрузки того же изображения из сети после перезапуска приложения, вам необходимо сохранить изображение во вторичном хранилище и прочитать его обратно при запуске приложения или когда вам снова понадобится изображение. NSCache будет сохранять объекты в памяти, пока это возможно, а затем освобождать их, когда памяти недостаточно. Поэтому, как только вы загрузили образ и сохранили его на диск, вы можете сохранить его в NSCache, чтобы сохранить его в памяти, чтобы вам не приходилось нажимать на диск второй раз. Это может помочь с производительностью, если у вас есть много изображений или других больших ресурсов, которые вы хотели бы иметь под рукой, но которые вы также можете прочитать снова, если вам нужно.

0 голосов
/ 18 апреля 2020

Если вам нужно использовать swift кеш, вы можете попробовать swiftlycache, который является библиотекой кеша, написанной на swift 5. Все типы, которые соответствуют коду, могут быть доступны напрямую или только для кеша памяти и дискового кеша. Может быть, вам понравится

...