#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!