2011-10-08 13 views

Respuesta

147

Este es un proceso de tres pasos. Primero creará un objeto NSURL para contener la URL a la que estamos intentando acceder. Proporcionaremos esta URL al método de clase NSData, +dataWithContentsOfURL: para obtener la imagen en la red como datos sin procesar, luego usaremos el método de clase +imageWithData: en UIImage para convertir los datos en una imagen.

NSURL *imageURL = [NSURL URLWithString:@"http://example.com/demo.jpg"]; 
NSData *imageData = [NSData dataWithContentsOfURL:imageURL]; 
UIImage *image = [UIImage imageWithData:imageData]; 

Tenga en cuenta que +dataWithContentsOfURL: ejecuta una solicitud de red síncrona. Si ejecuta esto en el hilo principal, bloqueará la interfaz de usuario hasta que los datos de imagen se reciban de la red. La mejor práctica es ejecutar cualquier código de red en un hilo de fondo. Si usted está apuntando OS 4.0+ se podría hacer algo como esto ...

NSURL *imageURL = [NSURL URLWithString:@"http://example.com/demo.jpg"]; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
    NSData *imageData = [NSData dataWithContentsOfURL:imageURL]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Update the UI 
     self.imageView.image = [UIImage imageWithData:imageData]; 
    }); 
}); 
+1

Gracias por la sugerencia, pero recibí un mensaje de error al poner el código en una clase, consulte mi ACTUALIZACIÓN –

+0

Se corrigió el error tipográfico . Hubo un paréntesis de cierre adicional en la primera llamada dispatch_async(). –

+0

Muchas gracias por la gran respuesta. :-) – kernix

7

Esto es lo que el mismo código podría ser como en Swift:

let image_url = NSURL("http://i.imgur.com/3yY2qdu.jpg") 

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
dispatch_async(dispatch_get_global_queue(priority, 0)) { 
    // do some task 
    let image_data = NSData(contentsOfURL: image_url!) 

    dispatch_async(dispatch_get_main_queue()) { 
     // update some UI 
     let image = UIImage(data: image_data!) 
     self.imageView.image = image 
    } 
} 
+0

En Xcode 9, la sintaxis Swift preferida para el envío asincrónico sería 'DispatchQueue.global (qos: .default) .async {// block}' – atineoSE

0

Para cualquiera que quiera cargar la imagen de la web de la biblioteca siguiente puede ser útil:

https://github.com/rs/SDWebImage

Es una categoría UIImageView que se ocupa de la carga asíncrona y almacenamiento en caché de imagen de la URL.