Images de processus SDWebImage avant la mise en cache
je récupère beaucoup d'images sur le web, et elles sont toutes sortes de tailles - elles peuvent être grandes, petites, etc..
Donc, je peux les redimensionner lorsque je les affiche dans la cellule, mais c'est inefficace. Il est préférable de les redimensionner après que SDWebImage les ait téléchargés et mis en cache les redimensionnés, au lieu de stocker de grandes images sur le disque et de les redimensionner pour chaque cellule.
alors comment puis-je faire cela avec SDWebImage, ou je dois pirater un peu la classe?
4 réponses
j'ai eu le même problème que vous, et j'ai essayé de modifier SDWebImage en premier, mais j'ai fini par construire mon propre composant qui a résolu le problème. Vous pouvez prendre de prendre un coup d'oeil ici : https://github.com/adig/RemoteImageView
Le développeur de SDWebImage Olivier Poitrey a répondu à cette question pour moi ici.
vous devez implémenter le protocole SDWebImageManagerDelegate et le Définir comme délégué du gestionnaire partagé comme ceci:
SDWebImageManager.sharedManager.delegate = self;
using the imageManager:transformDownloadedImage:withURL: instance method.
a Fonctionné parfaitement pour moi.
SDWebImage 3.8.2
si vous utilisez UIImageView category sd_setImageWithURL
. J'ai créé une autre catégorie UIImageView (extension)
func modifiedImageFromUrl(url: NSURL?) {
self.sd_setImageWithURL(url) { (image, error, cacheType, url) in
if cacheType == SDImageCacheType.None && image != nil {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) {
let modifiedImage = // modify image as you want
dispatch_async(dispatch_get_main_queue()) {
SDWebImageManager.sharedManager().saveImageToCache(modifiedImage, forURL: url)
self.image = modifiedImage
}
}
}
}
}
Expansion sur le MaeSTRo de la réponse Swift 3:
myImageView.sd_setImage(with: imageUrl){ (image, error, cacheType, url) in
guard let image = image, cacheType == .none else { return }
DispatchQueue.global(qos: .userInitiated).async {
let modifiedImage = myImageProcessor(image)
SDWebImageManager.shared().saveImage(toCache: modifiedImage, for: imageUrl)
DispatchQueue.main.async {
myImageView.image = modifiedImage
myImageView.setNeedsDisplay()
}
}
}