2010-04-21 73 views
2

我想編碼一個異步圖像下載程序。我使用NSURLConnection將數據獲取到NSMutableData中,並在完成初始化UIImage後使用該數據。iPhone UIImage initWithData失敗

我檢查了字節,它正確下載整個圖像(正確的字節數),但是;當我打電話

[UIImage imageWithData:data] 

,然後檢查圖像的屬性,它是零寬度和高度爲垃圾號碼,其實,相同數量的不管形象是什麼。我嘗試了一堆不同的圖像,PNG,JPG,不同的網址,它總是下載圖像,但UIImage無法使用該數據進行初始化。我在這裏做錯了什麼?

謝謝。

代碼是真的如你希望它看起來像:

連接代表:

-(void)connectionDidFinishLoading:(NSURLConnection*)theConnection { 
[[ImageManager sharedInstance] dataDownloadedBy:self]; } 

的ImageManager:

-(void)dataDownloadedBy:(WebConnection *)connection{  
WebImage *image = [[WebImage alloc] initWithLink:connection.url]; 
[image setImageFromData:connection.data]; 
[images addObject:image]; 
[connection release];} 

WebImage:

-(void)setImageFromData:(NSMutableData *)data{ 
image = [[UIImage alloc] initWithData:data];} 
+0

你可能需要發佈的代碼下載數據和初始化數據對象 – TechZen 2010-04-21 19:02:59

+0

我添加了代碼。 – 2010-04-21 19:32:16

回答

2

首先,我確定UIImage不會用垃圾數據進行初始化。構造函數initWithData分析數據以確定文件格式。如果您的數據損壞,則返回的圖像將爲零。首先檢查。

-(void)dataDownloadedBy:(WebConnection *)connection{  
    WebImage *image = [[WebImage alloc] initWithLink:connection.url]; 
    [image setImageFromData:connection.data]; 
    if (image.image != nil) { [images addObject:image]; } 
    [connection release]; 
}

其次,請確保在下載過程中追加數據。這裏是回調方法:

- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [self.receivedData appendData:data]; 
}

最後,您的代碼必須絕對包括第二種情況:下載失敗。

- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    [connection release]; 
}

您的問題描述缺少一些重要的代碼段。

Apple的URLCache演示是瞭解異步圖像下載的非常好的項目。 http://developer.apple.com/iphone/library/samplecode/URLCache/Introduction/Intro.html

我希望這會幫助你!

0

我不知道是什麼是錯誤的,它可能是你不正確地使用發佈,說我不知道​​你爲什麼釋放連接在dataDownloadedBy的結尾,它應該是圖像? 它可以幫助你在這裏發佈更多的代碼。

我用來做同樣的事情,你可以有一個看的帖子在這裏 http://blog.163.com/[email protected]/blog/static/1079307120096895433277/

希望它可以幫助

0

如果initWithData出現故障,很可能是你得到的圖像數據被破壞。你應該將它保存到這樣的文件:

[data writeToFile:@"/tmp/foo.jpg" atomically:NO]; 

然後嘗試在Preview.app中打開它。

0

一個不同的問題,但這給了同樣的痛苦的錯誤是,如果你要求一個文件不可訪問:HTTP服務器將返回錯誤404消息,你的代碼讀取該字節(它們不是有效字節的圖像,你會得到零。