Cuando queremos actualizar un UIImageView desde una dirección URL, descargando la imagen desde un servidor Web, debemos considerar algunos puntos:
Al actualizar desde una URL, puede que el tiempo de descarga de la imagen sea considerable, y podemos dejar bloqueado el interfaz de usuario durante la descarga, lo que empeora la usabilidad. Esto ocurre por ejemplo si lo hacemos así:
NSURL *url = [NSURL URLWithString:@"http://servidorweb.com/ruta-a-mi-imagen.png"]; NSData *data = [NSData dataWithContentsOfURL:url]; miimageview.image = [UIImage imageWithData:data];
Para solucionar el problema del bloqueo del UI, podemos utilizar una descarga asícrona, o mejor, crear un componente UIImageView con capacidad de descarga de imágenes asíncrona. Esta segunda solución es algo más compleja inicialmente, pero es totalmente reutilizable.
Si queremos una solución rápida, para un problema puntual, podemos también hacer lo siguiente:
// URL a descargar y request NSURL * url = [NSURL URLWithString:@"http://servidorweb.com/ruta-a-mi-imagen.png"]; NSMutableURLRequest * myRequest = [NSMutableURLRequest requestWithURL:url]; [myRequest setHTTPMethod:@"POST"]; [myRequest setTimeoutInterval:3000]; // Lanzamos la petición asíncrona [NSURLConnection sendAsynchronousRequest:myRequest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * response, NSData * returnData, NSError * error) { if(error == nil){ // UIImage a partir de los datos recibidos de la URL UIImage * imagen = [UIImage imageWithData:returnData]; // Importante, la actualización del UIImageView debe realizarse en el UI [[NSOperationQueue mainQueue] addOperationWithBlock:^{ iv.image = imagen; }]; } }];
One Comment