2009-08-17 8 views
9

Ich bin ziemlich neu in der iPhone-Entwicklung und versuche, Bilder von Server in meiner Anwendung zu holen.Bild von URL/Server erhalten

ich die folgende Methode bin mit, dies zu tun:

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

Mit dieser Funktion das erwartete Bild nicht zurück, obwohl ich in Debugger, NSData für das Image-Objekt einen Wert (in Bytes) hat sehen können

Obwohl eine sehr ähnliche Funktion zum Abrufen von Text vom Server funktioniert und ich erwarte Werte.

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

Diese Methode funktioniert gut.

Könnte mir bitte jemand helfen, zu verstehen, warum ich das Image nicht vom Server bekomme?

Dank

Antwort

1

Die wahrscheinlichste Ursache ist, dass Sie ein Bild nicht wirklich sind zu holen, oder Sie ein Bild zu holen, dass das iPhone nicht dekodieren kann. Ich würde beginnen, indem Sie den MIME-Typ des Ergebnisses überprüfen ([response MIMEType]) und stellen Sie sicher, dass es das ist, was Sie erwarten und nicht tatsächlich eine Schnur zum Beispiel. Dann stellen Sie sicher, dass Ihr Typ ist einer der Typen UIImage kann umgehen: tiff, jpeg, gif, png, bmp, ico, cur, xbm.

1

Es könnte sehr gut sein, dass das, was Ihr Server zurückgibt, nicht wirklich Bilddaten sind, und Sie können einfach die URL in einen Browser einfügen und sehen, ob Sie das Bild bekommen. Es scheint nichts mit dem Code zu tun zu haben, abgesehen von der fehlenden Fehlerüberprüfung.

Wenn Sie eine non-image NSData in eine + imageWithData-Nachricht übergeben, erhalten Sie null. Du solltest das wahrscheinlich überprüfen.

29

Wenn alles, was Sie versuchen, ist ein Bild von einem Web-Server über eine URL zu greifen, gibt es einen einfacheren Weg.

Dies ist, was ich benutze:

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

Und wenn Sie es auf ein Bild Ansicht verwenden möchten, tun Sie einfach die folgenden Schritte aus:

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

Ich bin sicher, es gibt Gründe, warum eine Person Vielleicht möchte ich diesen Ansatz nicht verwenden, aber ich würde damit beginnen und sehen, ob es tun wird, was Sie brauchen.

+1

Solange man es in einem separaten Thread gestellt, so dass die UI-up nicht sperren . – Domness

+0

Warum veröffentlichen Sie myImage? Du hast es nicht zugewiesen –

1

Es ist wahrscheinlich nicht direkt relevant für Ihre Frage, aber ich wollte darauf hinweisen, dass Ihre Fehlerprüfung hier ein potenzielles Problem hat. Methoden wie diese, die einen Bezugsparameter zu einer NSError haben, definieren im Allgemeinen nicht, was sie bei Erfolg zurückgeben. Mit anderen Worten, sollten Sie die Methoden Wert, um Rückkehr zuerst und nur Zugriff auf den Fehlerzeiger, wenn das Verfahren fehlgeschlagen:

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]; 
} 
Verwandte Themen