Объяснение того, что делает код кэширования изображений

#swift #image

#быстрый #изображение

Вопрос:

Кто-нибудь может объяснить, как работает этот код кэширования изображений? Я понимаю, что выполняется задача по загрузке содержимого ImageUrl, проверяет, присутствует ли ошибка, и отображает ее в основном потоке. Но какая польза от forKey: url.absoluteString в качестве NSString?

 func downloadImage(from urlString: String ) {
        guard let url = URL(string: urlString) else { return }
        storeCache(url: url)
    }
    
    func storeCache(url:URL){
        if let cachedImage = imageCache.object(forKey: url.absoluteString as NSString) as? UIImage {
            self.image = cachedImage
        }else {
            let _: Void = URLSession.shared.dataTask(with: url) { [weak self] data, response, error in
                guard let self = self else { return }
                if error != nil { return }
                DispatchQueue.main.async {
                    if let downloadedImage = UIImage(data: data!) {
                        imageCache.setObject(downloadedImage, forKey: url.absoluteString as NSString)
                        self.image = downloadedImage
                    }
                }
            }.resume()
        }
    }
    
 

Ответ №1:

Ваш кэш — это, по сути, причудливый [url: image] словарь. Это позволяет устройству запрашивать один раз, а затем запоминать изображения, пока приложение не будет закрыто.

Каждый раз, когда вам нужно изображение, ваше приложение будет проверять кэш, как словарь, и спрашивать, есть ли уже загруженное изображение с этого URL.

if let cachedImage = imageCache.object(forKey: url.absoluteString... // empty

Конечно, при первом запуске приложения кэш будет пуст. Таким образом, он получает изображение из Интернета и сохраняет его в кэше, помня, с какого URL-адреса оно пришло.

imageCache.setObject(downloadedImage, forKey: url.absoluteString... // cache the image

С этого момента всякий раз, когда ему требуется изображение с того же URL-адреса, он проверяет кэш и видит, что вы его уже загрузили. Больше никаких запросов.

if let cachedImage = imageCache.object(forKey: url.absoluteString... // something there!