2009-08-17 203 views
9

我對iPhone開發相當陌生,並試圖從我的應用程序中獲取'來自服務器的圖像'。從URL /服務器獲取圖像

我用下面的方法來做到這一點:

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

此函數不返回預期的圖像,雖然我可以在調試器的NSData爲Image對象有一定的價值(以字節爲單位)看到

雖然,從服務器獲取文本的工作非常類似,我得到了預期的值。

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

此方法工作正常。

有人能幫我理解爲什麼我沒有從服務器獲取圖像嗎?

感謝

回答

1

最可能的原因是,你沒有真正獲取的圖像,或者你取一個形象,iPhone不能解碼。我將首先檢查結果的MIME類型([response MIMEType]),並確保它是你所期望的,而不是實際的字符串。然後確保你的類型是UIImage可以處理的類型之一:tiff,jpeg,gif,png,bmp,ico,cur,xbm。

1

這很可能是你的server're返回實際上不是圖像數據,並且可以將網址只是粘貼到瀏覽器,看看你得到的圖像。除了缺少錯誤檢查以外,代碼似乎沒有任何問題。

當你傳遞一個非圖像的NSData成+ imageWithData消息,你會得到零。你應該檢查一下。

29

如果你正在嘗試做的是通過URL有一個更簡單的方式抓住從一個Web服務器的圖像。

這是我用:

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

如果你想使用它的形象圖只是做到以下幾點:

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

我敢肯定是有原因的人可能不想使用這種方法,但我會從這開始,看看它是否會做你需要的。

+1

只要你把它放在一個單獨的線程,因此用戶界面不會鎖定。 – Domness 2011-12-09 20:54:09

+0

爲什麼你釋放myImage?你還沒有分配它 – 2013-07-04 12:11:24

1

這可能不是你的問題直接相關,但我想指出的是,在這裏你的錯誤檢查有一個潛在的問題。像這樣的具有NSError的引用參數的方法通常不會定義它們在成功時返回的內容。換句話說,你應該檢查方法先返回值,只有訪問差錯指針,如果該方法失敗:

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