2009-05-31 11 views
45

Estoy tratando de obtener una imagen de una URL y no parece funcionar para mí. ¿Alguien me puede apuntar en la dirección correcta?Obtener imagen de URL Objetivo C

Aquí está mi código:

NSURL *url = [NSURL URLWithString:@"http://myurl/mypic.jpg"]; 

NSString *newIMAGE = [[NSString alloc] initWithContentsOfURL:url 
             encoding:NSUTF8StringEncoding error:nil]; 

cell.image = [UIImage imageNamed:newIMAGE]; 

Cuando puedo depurar la cadena newimage es nula por lo que algo no está funcionando allí.

Respuesta

148

Lo que se quiere es obtener los datos de la imagen, a continuación, inicializar una UIImage usando esos datos:

NSData * imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: @"http://myurl/mypic.jpg"]]; 
cell.image = [UIImage imageWithData: imageData]; 
[imageData release]; 

Conforme a lo solicitado, aquí es una versión asíncrona:

dispatch_async(dispatch_get_global_queue(0,0), ^{ 
    NSData * data = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: @"http://myurl/mypic.jpg"]]; 
    if (data == nil) 
     return; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // WARNING: is the cell still using the same data by this point?? 
     cell.image = [UIImage imageWithData: data]; 
    }); 
    [data release]; 
}); 
+0

Gracias. Eso trabajado – TheGambler

+1

esto es sincrónico, puede usted por favor añadir un código para descargarlo en el fondo, porque, se BLOQUES el hilo de interfaz de usuario – Houcine

+1

Un par de problemas: 1. Usted tiene un comentario acerca de asegurarse de que la célula es todavía visible. Usted hace eso con 'UITableViewCell * updateCell = [tableView cellForRowAtIndexPath: indexPath];' seguido de 'if (updateCell) ...' (y obviamente, use esta 'updateCell' en lugar de la' célula' original para su actualización del ' imageView'; 2. Asegúrese, si lo hace de forma asíncrona, de inicializar la propiedad 'image' para su' imageView' antes de iniciar el proceso de recuperación asíncrona; 3. Realmente debería hacer el almacenamiento en caché, por lo que no tiene que volver a recuperarlo cada vez que se desplaza hacia atrás a una imagen previamente cargada. – Rob

4

Ok hay un par de cosas mal aquí:

  1. La conversión de URL (URL) a NSString (newImage) es incorrecta, lo que el código en realidad no existe intente cargar el contenido de "http://myurl/mypic.jpg "en el NSString".

  2. El método -imageNamed toma una cadena que es una ruta de un archivo local, no una URL como argumento.

Es necesario utilizar un objeto NSData como intermediario, como en este ejemplo: http://blogs.oreilly.com/digitalmedia/2008/02/creating-an-uiimage-from-a-url.html

3

la versión asíncrona de respuesta aceptada trabajó muy lento en mi código. un enfoque usando NSOperation trabajó años luz más rápido. el código proporcionado por Joe Masilotti ->objective - C : Loading image from URL? (y pegado a continuación):

-(void) someMethod { 
    // set placeholder image 
    UIImage* memberPhoto = [UIImage imageNamed:@"place_holder_image.png"]; 

    // retrieve image for cell in using NSOperation 
    NSURL *url = [NSURL URLWithString:group.photo_link[indexPath.row]]; 
    [self loadImage:url]; 
} 

- (void)loadImage:(NSURL *)imageURL 
{ 
    NSOperationQueue *queue = [NSOperationQueue new]; 
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] 
             initWithTarget:self 
             selector:@selector(requestRemoteImage:) 
             object:imageURL]; 
    [queue addOperation:operation]; 
} 

- (void)requestRemoteImage:(NSURL *)imageURL 
{ 
    NSData *imageData = [[NSData alloc] initWithContentsOfURL:imageURL]; 
    UIImage *image = [[UIImage alloc] initWithData:imageData]; 

    [self performSelectorOnMainThread:@selector(placeImageInUI:) withObject:image waitUntilDone:YES]; 
} 

- (void)placeImageInUI:(UIImage *)image 
{ 
    [self.memberPhotoImage setImage:image]; 
} 
0

En Swift 3 y 4

let theURL = URL(string:"https://exampleURL.com") 
let imagedData = NSData(contentsOf: theURL!)! 
let theImage = UIImage(data: imagedData as Data) 
cell.theImageView.image = theImage 

Esto se hará en el hilo principal.

Y para realizar lo mismo en asíncrono/fondo hilo

DispatchQueue.main.async(){ 
     let theURL = URL(string:"https://exampleURL.com") 
     let imagedData = NSData(contentsOf: theURL!)! 
     let theImage = UIImage(data: imagedData as Data) 
    } 
    cell.theImageView.image = theImage 
Cuestiones relacionadas