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?

10
demandé sur Devfly 2012-10-17 10:05:01

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

5
répondu adig 2012-10-17 07:21:34

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.

Plus d'informations.

a Fonctionné parfaitement pour moi.

24
répondu Jayson Ng 2013-03-13 19:03:58

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
                }
            }
        }
    }
}
1
répondu MaeSTRo 2016-10-17 15:27:39

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()
        }
    }
}
1
répondu Intentss 2017-02-08 22:58:26