objective-c uiimage sdwebimage

objective c - SDWebImage Descargar imagen y almacenar en caché para clave



objective-c uiimage (9)

// CREAR UN IMAGEVIEW CUSTOME Y PASAR LA URL DE LA IMAGEN POR ARRAY (INDEXPATH.ROW)

(void) loadImage:(NSString *)imageLink{ imageLink = [imageLink stringByReplacingOccurrencesOfString:@" " withString:@"%20"]; SDWebImageManager *manager = [SDWebImageManager sharedManager]; [manager loadImageWithURL:[NSURL URLWithString:imageLink] options:SDWebImageDelayPlaceholder progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) { } completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) { imageFrame.image = image; }]; }

Hola, estoy utilizando el marco SDWebImage en un proyecto y quiero descargar y almacenar imágenes en caché, pero creo que mi código almacena una imagen en la memoria caché dos veces. ¿Hay alguna forma de almacenar la imagen en el caché con una clave solo una vez? Aquí está mi código.

SDWebImageManager *manager = [SDWebImageManager sharedManager]; [manager downloadWithURL:[NSURL URLWithString:url] options:0 progress:^(NSUInteger receivedSize, long long expectedSize) { } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) { if(image){ NSString *localKey = [NSString stringWithFormat:@"Item-%d", i]; [[SDImageCache sharedImageCache] storeImage:image forKey:localKey]; } }];

¿Hay algo que me perdí? Parece que hacer esto en mi instrumento de asignaciones está acumulando una gran cantidad de memoria.


En Swift, use el siguiente código para descargar una imagen y almacenarla en el caché:

//SDWebImageManager download image with High Priority SDWebImageManager.sharedManager().downloadImageWithURL(NSURL(string: imageUrl), options: SDWebImageOptions.HighPriority, progress: { (receivedSize :Int, ExpectedSize :Int) in SVProgressHUD.show() }, completed: { (image :UIImage!, error:NSError!, cacheType :SDImageCacheType, finished :Bool,imageUrl: NSURL!) in if(finished) { SVProgressHUD.dismiss() if((image) != nil) { //image downloaded do your stuff } } })

Versión Swift 3 :

SDWebImageManager.shared().downloadImage(with: NSURL(string: "...") as URL!, options: .continueInBackground, progress: { (receivedSize :Int, ExpectedSize :Int) in }, completed: { (image : UIImage?, error : Error?, cacheType : SDImageCacheType, finished : Bool, url : URL?) in })

Versión Objective-C :

[[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:imageUrl] options:SDWebImageDownloaderUseNSURLCache progress:nil completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { if (image && finished) { // Cache image to disk or memory [[SDImageCache sharedImageCache] storeImage:image forKey:CUSTOM_KEY toDisk:YES]; } }];


Me sorprende que nadie haya respondido a esta pregunta, pero tuve una pregunta similar y la encontré, así que la responderé para las personas que ven esto en el futuro (suponiendo que ya lo haya resuelto usted mismo).

Para responder directamente a su pregunta, sí, está almacenando en caché la imagen dos veces.

Descargue las llamadas a SDWebImageManager automáticamente caché de imágenes con claves basadas en la cadena absoluta de la url de la imagen. Si desea su propia clave, puede usar la llamada de descarga en SDWebImageDownloader que, por lo que sé, NO se almacena en caché de forma predeterminada. Desde allí, puede llamar a sharedImageCache como ya lo está haciendo y almacenar en caché con la tecla que desee.

Aparte de eso, es extraño que se estén acumulando asignaciones en cualquier caso, ya que a SDWebImage le gusta almacenar en caché en el disco y no en la memoria en general. Tal vez algo más está pasando al mismo tiempo?

Espero que esto ayude,

-Brandon


Prueba esto para Swift 4.0 .

let url = URL(string: imageUrl!) SDWebImageManager.shared().imageDownloader?.downloadImage(with: url, options: .continueInBackground, progress: nil, completed: {(image:UIImage?, data:Data?, error:Error?, finished:Bool) in if image != nil {. } })


Pruebe APSmartStorage ( https://github.com/Alterplay/APSmartStorage ) en lugar de SDWebImage.

APSmartStorage obtiene datos de la red y los almacena en caché automáticamente en el disco o en la memoria de una forma configurable inteligente. Debe ser lo suficientemente bueno para su tarea.


SDWebImage almacena en caché la imagen tanto en el disco como en la memoria. Vamos a pasar por esto:

  1. Descargar la imagen de una nueva url.
  2. Se almacena en la memoria caché y en el disco.
  3. Si llama a la imagen en la misma sesión, se recupera de la memoria.
  4. Digamos que vuelve a ejecutar la aplicación y luego accede a la url, comprobará la memoria, la imagen no estará allí, luego comprobará el disco y la obtendrá desde allí. Si no, lo descargará.
  5. La imagen permanece en el disco durante una semana según la configuración estándar.

Por lo tanto, no necesita preocuparse por el almacenamiento en caché. SDWebImage lo cuida bastante bien.

Puede realizar una implementación personalizada para el almacenamiento en caché, así como la actualización de la imagen desde el caché, en caso de que desee la configuración según su encabezado de almacenamiento en caché HTTP también.

Puedes encontrar los detalles completos en su página de github here .


Sí, es posible descargar la imagen usando SDWebImage y almacenar en la memoria local manualmente .

Almacén de imágenes descargadas en la memoria local usando SDWebImage

func saveImage(url: URL, toCache: UIImage?, complation: @escaping SDWebImageNoParamsBlock) { guard let toCache = toCache else { return } let manager = SDWebImageManager.shared() if let key = manager.cacheKey(for: url) { manager.imageCache?.store(toCache, forKey: key, completion: complation) } }

Cargar imagen desde la memoria usando la URL de la imagen

static func imageFromMemory(for url: String) -> UIImage? { if let encoded = url.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed), let url = URL(string: encoded) { let manager = SDWebImageManager.shared() if let key: String = manager.cacheKey(for: url), let image = manager.imageCache?.imageFromMemoryCache(forKey: key) { return image } } return nil }


Swift 4:

SDWebImageManager.shared().loadImage( with: URL(string: imageUrl), options: .highPriority, progress: nil) { (image, data, error, cacheType, isFinished, imageUrl) in print(isFinished) }


SDWebImageManager *manager = [SDWebImageManager sharedManager]; [manager downloadImageWithURL:ImageUrl options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if(image){ NSLog(@"image=====%@",image); } }];