2009-08-17 20 views
9

Jestem dość nowy w rozwoju iPhone'a i próbuję pobrać "Obrazy z serwera" w mojej aplikacji.Uzyskiwanie obrazu z adresu URL/serwera

używam następujące metody, aby to zrobić:

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

Ta funkcja nie zwraca oczekiwanego obrazu chociaż widzę, że NSData debugger dla obiektu obraz ma jakąś wartość (w bajtach)

Mimo to działa bardzo podobna funkcja do pobierania tekstu z serwera i otrzymuję oczekiwane wartości.

Ta metoda działa dobrze.

Czy ktoś mógłby mi pomóc w zrozumieniu, dlaczego nie otrzymuję obrazu z serwera?

Dzięki

Odpowiedz

1

Najbardziej prawdopodobną przyczyną jest to, że nie jesteś faktycznie pobieranie obrazu, lub pobierasz obraz, że iPhone nie może dekodować. Zacznę od sprawdzenia typu MIME wyniku ([response MIMEType]) i upewnij się, że jest to oczekiwane, a nie ciąg znaków na przykład. Następnie upewnij się, że Twój typ jest jednym z typów obsługiwanych przez: UIImage: tiff, jpeg, gif, png, bmp, ico, cur, xbm.

1

Może się zdarzyć, że to, co powróci serwer, w rzeczywistości nie jest danymi obrazu, a możesz po prostu wkleić adres URL do przeglądarki i sprawdzić, czy otrzymasz obraz. W kodzie nie ma nic złego, z wyjątkiem braku sprawdzania błędów.

Po przekazaniu nieopisanego obrazu NSData do wiadomości + imageWithData, otrzymasz zero. Powinieneś prawdopodobnie to sprawdzić.

29

Jeśli wszystko, co próbujesz zrobić, to pobrać obraz z serwera WWW za pośrednictwem adresu URL jest łatwiejszy sposób.

To co mam użyć:

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

A jeśli chcesz używać go na widoku obrazu po prostu wykonaj następujące czynności:

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

Jestem pewien, że istnieją powody, dla których osoba może nie chcieć używać tego podejścia, ale zacznę od tego i zobaczę, czy zrobi to, czego potrzebujesz.

+1

Dopóki można umieścić go w osobnym wątku, więc UI nie zamknąć . – Domness

+0

Dlaczego wypuszczasz myImage? Nie przydzieliłeś tego –

1

Prawdopodobnie nie jest to bezpośrednio związane z twoim pytaniem, ale chciałem zaznaczyć, że twoja kontrola błędów tutaj ma potencjalny problem. Metody takie jak te, które mają parametr referencyjny do NSError, zasadniczo nie definiują tego, co zwracają po sukcesie. Innymi słowy, należy sprawdzić wartość metody najpierw powrócić, a tylko dostęp wskaźnik błędu, jeśli metoda nie powiodło się:

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]; 
} 
Powiązane problemy