2010-04-21 75 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消息,你的代码读取该字节(它们不是有效字节的图像,你会得到零。