2009-08-17 18 views
9

Sono abbastanza nuovo per lo sviluppo di iPhone e sto cercando di recuperare "Immagini dal server" nella mia applicazione.Ottenere immagini da URL/server

sto usando il seguente metodo per fare questo:

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

Questa funzione non restituisce l'immagine previsto anche se posso vedere in debugger che NSData per l'oggetto immagine ha un certo valore (in bytes)

Sebbene, una funzione molto simile per ottenere il testo dal server funzioni e ottengo i valori previsti.

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

Questo metodo funziona correttamente.

Qualcuno potrebbe aiutarmi a capire perché non ottengo l'Immagine dal server?

Grazie

risposta

1

La causa più probabile è che non si è in realtà il recupero di un'immagine, o si sta recupero un'immagine che iPhone non può decodificare. Vorrei iniziare controllando il tipo MIME del risultato ([response MIMEType]) e assicurati che sia quello che ti aspetti e non in realtà una stringa, per esempio. Quindi assicurati che il tuo tipo sia uno dei tipi UIImage in grado di gestire: tiff, jpeg, gif, png, bmp, ico, cur, xbm.

1

Potrebbe benissimo essere che ciò che il server sta restituendo non sono in realtà dati immagine, e puoi semplicemente incollare l'URL in un browser e vedere se ottieni l'immagine. Non sembra che ci sia qualcosa di sbagliato nel codice se non per la mancanza di controllo degli errori.

Quando si passa un NSData non immagine in un messaggio + imageWithData, si ottiene zero. Probabilmente dovresti controllarlo.

29

Se tutto quello che stai cercando di fare è catturare un'immagine da un server web tramite un URL, c'è un modo più semplice.

Questo è quello che uso:

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

E se si desidera utilizzare su una vista dell'immagine basta effettuare le seguenti operazioni:

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

Sono sicuro che ci sono ragioni per cui una persona potrebbe non voler usare questo approccio, ma vorrei iniziare con questo e vedere se farà quello che ti serve.

+1

Finché lo metti in un thread separato in modo l'interfaccia utente non lock-up . – Domness

+0

Perché rilasci myImage? Non l'hai assegnato –

1

Probabilmente non è direttamente pertinente alla tua domanda, ma volevo sottolineare che il tuo controllo degli errori qui ha un potenziale problema. Metodi come questo che hanno un parametro di riferimento su un NSError generalmente non definiscono cosa restituiscono in caso di successo. In altre parole, si dovrebbe verificare i metodi restituiscono primo valore, e solo accesso il puntatore errore se il metodo non è riuscita:

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]; 
} 
Problemi correlati