2009-08-17 5 views
9

Je ne suis pas familiarisé avec le développement de l'iPhone et j'essaie d'extraire les images du serveur dans mon application.Obtenir une image à partir d'une URL/serveur

J'utilise la méthode suivante pour ce faire:

- (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; 
} 

Cette fonction ne renvoie pas l'image attendue, bien que je peux voir dans débogueur NSData pour l'objet image a une certaine valeur (en octets)

Bien que, une fonction très similaire pour obtenir le texte du serveur fonctionne et j'obtiens des valeurs attendues.

- (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]; 
} 

Cette méthode fonctionne correctement.

Est-ce que quelqu'un pourrait m'aider à comprendre pourquoi je ne reçois pas l'image du serveur?

Merci

Répondre

1

La cause la plus probable est que vous n'êtes pas une image réellement aller chercher, ou vous récupérez une image que l'iPhone ne peut pas décoder. Je voudrais commencer par vérifier le type MIME du résultat ([response MIMEType]) et assurez-vous que c'est ce que vous attendez et pas vraiment une chaîne par exemple. Ensuite, assurez-vous que votre type est l'un des types UIImage peut gérer: tiff, jpeg, gif, png, bmp, ico, cur, xbm.

1

Il se peut très bien que ce que votre serveur renvoie ne soit pas réellement une image, et vous pouvez simplement coller l'URL dans un navigateur et voir si vous obtenez l'image. Il ne semble pas y avoir de problème avec le code, à part l'absence de vérification d'erreur.

Lorsque vous transmettez un non-image NSData dans un message + imageWithData, vous obtiendrez nil. Vous devriez probablement vérifier cela.

29

Si tout ce que vous essayez de faire est de récupérer une image à partir d'un serveur Web via une URL, il est plus facile.

C'est ce que j'utilise:

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

Et si vous voulez l'utiliser sur une vue d'image ne sont pas seulement les éléments suivants:

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

Je suis sûr qu'il ya des raisons pour lesquelles une personne Je ne voudrais peut-être pas utiliser cette approche, mais je commencerais par cela et je verrai si cela fera ce que vous voulez.

+1

Tant que vous le mettez dans un thread séparé si l'interface utilisateur ne se verrouille pas . – Domness

+0

Pourquoi lancez-vous myImage? Vous ne l'avez pas attribué –

1

Ce n'est probablement pas directement pertinent à votre question, mais je tenais à souligner que votre vérification d'erreur ici a un problème potentiel. Les méthodes comme celle-ci qui ont un paramètre de référence à NSError ne définissent généralement pas ce qu'elles retournent en cas de succès. En d'autres termes, vous devriez vérifier les méthodes renvoient la valeur première et ne accès le pointeur d'erreur si la méthode a échoué:

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]; 
} 
Questions connexes