2009-08-17 17 views
9

Soy bastante nuevo en el desarrollo de iPhone y trato de buscar 'Imágenes del servidor' en mi aplicación.Obtener imagen de URL/servidor

estoy usando el siguiente método para hacer esto:

- (UIImage *)imageFromURLString:(NSString *)urlString 
{ 
    NSURL *url = [NSURL URLWithString:urlString]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 
    [request setHTTPMethod:@"GET"]; 

    NSURLResponse *response = nil; 
    NSError *error = nil; 
    NSData *result = [NSURLConnection sendSynchronousRequest:request   
    returningResponse:&response error:&error]; 
    [request release]; 
    [self handleError:error]; 
    UIImage *resultImage = [UIImage imageWithData:(NSData *)result]; 

    NSLog(@"urlString: %@",urlString); 
    return resultImage; 
} 

Esta función no devuelve la imagen esperada aunque puedo ver en el depurador que NSData para el objeto imagen tiene algún valor (en bytes)

Aunque, una función muy similar para obtener texto del servidor funciona y obtengo los valores esperados.

- (NSString *)jsonFromURLString:(NSString *)urlString 
{ 

    NSURL *url = [NSURL URLWithString:urlString]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 
    [request setHTTPMethod:@"GET"]; 

    NSURLResponse *response = nil; 
    NSError *error = nil; 
    NSData *result = [NSURLConnection sendSynchronousRequest:request 
    returningResponse:&response error:&error]; 
    [request release]; 
    [self handleError:error]; 
    NSString *resultString = [[NSString alloc] initWithData:result 
    encoding:NSUTF8StringEncoding]; 

    return [resultString autorelease]; 
} 

Este método funciona bien.

¿Podría alguien ayudarme a comprender por qué no obtengo la imagen del servidor?

Gracias

Respuesta

1

La causa más probable es que usted no está realmente ir a buscar una imagen, o si está ir a buscar una imagen que iPhone no puede decodificar. Comenzaría por verificar el tipo MIME del resultado ([response MIMEType]) y me aseguraré de que sea lo que está esperando y no una cadena, por ejemplo. Luego asegúrese de que su tipo sea uno de los tipos UIImage que pueda manejar: tiff, jpeg, gif, png, bmp, ico, cur, xbm.

1

Bien podría ser que lo que está devolviendo su servidor no sea en realidad datos de imagen, y simplemente puede pegar la url en un navegador y ver si obtiene la imagen. No parece haber ningún problema con el código, excepto por la falta de comprobación de errores.

Cuando pasa un NSData sin imagen a un mensaje + imageWithData, obtendrá nil. Probablemente deberías comprobar eso.

29

Si todo lo que intenta hacer es tomar una imagen de un servidor web a través de una URL, hay una manera más fácil.

Esto es lo que yo uso:

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

Y si quieres usarlo en una vista de la imagen simplemente haga lo siguiente:

// Let's assume the picture is an instantiated UIImageView 
[picture setImage: myImage]; 
[myImage release]; 

Estoy seguro de que hay razones por las que una persona Puede que no quiera usar este enfoque, pero comenzaría con esto y vería si hará lo que usted necesita.

+1

Mientras lo pones en un hilo separado por lo que la interfaz de usuario no bloquee . – Domness

+0

¿Por qué lanzas myImage? No lo has asignado –

1

Probablemente no sea directamente relevante para su pregunta, pero sí quiero señalar que su error al verificar aquí tiene un problema potencial. Los métodos como este que tienen un parámetro de referencia para NSError generalmente no definen lo que devuelven en caso de éxito. En otras palabras, usted debe comprobar los métodos devuelven el valor primero, y sólo se acceso al puntero de error si el método falló:

NSString *resultString = nil; 
NSData *result = [NSURLConnection sendSynchronousRequest:request 
             returningResponse:&response 
                error:&error]; 
[request release]; 

if(result) { 
    resultString = [[NSString alloc] initWithData:result 
             encoding:NSUTF8StringEncoding]; 
} 
else { 
    [self handleError:error]; 
} 
Cuestiones relacionadas