Можно ли отредактировать URL-адрес изображения перед его кешированием с помощью SDWebImage? - PullRequest
0 голосов
/ 13 июля 2020

Я использую URL-адрес изображения S3. Он содержит часть секретного ключа. Я использую SDWebImage для загрузки изображений. Я хочу кэшировать изображения, но из-за изменения подписи от S3 я не могу кэшировать изображение (из-за изменения подписи все URL-адреса изображений отличаются). Можно ли кэшировать изображение без этой подписи в url-адресе?

1 Ответ

0 голосов
/ 16 июля 2020

Я получил на это ответ. SDWebImage обеспечивает скачивание без кеширования и кеширование с ключом. По моему требованию, этого достаточно.

  • Сначала установите ключ кеширования для кэширования изображения.
  • Затем проверьте, доступно ли изображение с этим ключом кеша.
  • Если недоступно, загрузите и кешируйте это изображение с помощью ключа.

После кэширования оно будет доступно при следующей проверке доступности кеша. Поэтому нет необходимости кэшировать изображение несколько раз.

расширение UIImageView {

func setImage(imageUrlString: String) {
    
    let sdManager = SDWebImageManager.shared
    let sdDownloader = SDWebImageDownloader.shared
    let sdChache = SDImageCache.shared
    var cacheKey: String?
    let placeholderimage = UIImage(named: "placeholder.png")
    
    guard let imageURL = URL(string: imageUrlString) else {
        self.image = placeholderimage
        return
    }
    guard let key = sdManager.cacheKey(for: imageURL) else {return}// set the key you want. In the case of s3 images you can remove the signature part and use the remainig url as key, beacause it's unique.
    cacheKey = key
    if let key = cacheKey {
        if let cachedImage = sdChache.imageFromCache(forKey: key) {
            self.image = cachedImage
        }
        else {
            self.sd_imageIndicator = SDWebImageActivityIndicator.gray
            self.sd_imageIndicator?.startAnimatingIndicator()
            sdDownloader.downloadImage(with: imageURL) { (downloadedImage, imageData, error, status) in
                self.sd_imageIndicator?.stopAnimatingIndicator()
                if let image = downloadedImage, let data = imageData {
                    self.image = image
                    self.sd_imageIndicator?.stopAnimatingIndicator()
                    sdManager.imageCache.store(image, imageData: data, forKey: key, cacheType: .all) {
                        print("Image Cached with key==> \(key)")
                    }
                }
                else{
                    self.image = placeholderimage
                }
            }
        }
    }
}

}

...