我正在尝试从服务器下载一些缩略图,然后在每个单元格中显示它们:
// displaying image...
dictionary = [newsFeed objectAtIndex:indexPath.row];
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[dictionary objectForKey:@"image"]]]];
cell.imageView.image = [image imageScaledToSize:CGSizeMake(55, 55)];
但下载并显示图像后,表格视图会慢慢滚动!
答案 0 :(得分:3)
主要问题是[NSData dataWithContentsOfURL:]
方法是同步请求。它阻止正在运行的线程,直到请求完成。
如果在主线程上运行此操作,则应避免此类交互。该线程将被冻结,用户将失望;)
你有很多解决方案。一个简单的方法是使用第三个库,如SDWebImage或AFNetworking。
两者都有UIImageView
类的类别,允许以简单的方式使用它们。例如,使用UIImageView+AFNetworking
,您应该执行以下操作:
[cell.imageView setImageWithURL:yourURL placeholderImage:yourPlaceholderImage];
答案 1 :(得分:2)
我想你是想说这个。
NSURL* url = [NSURL URLWithString:@"http://www.YourImageUrl.com"];
NSURLRequest* request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse * response,
NSData * data,
NSError * error) {
if (!error){
UIImage* image = [[UIImage alloc] initWithData:data];
// Now workout with the image
}
}];
这将进行异步调用,并在加载tableview后加载图像,即当图像加载完成时图像将显示但是当需要加载表视图时将加载表。
答案 2 :(得分:1)
像这样直接使用
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[dictionary objectForKey:@"image"]]]];
它需要主线程,因此您无法滚动下载您的Image.So您添加NSURLConnectionDataDelegate,NSURLConnectionDelegate添加此协议并通过
下载图像在要下载图像的位置插入这些编码行
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
received_data = [[NSMutableData alloc]init];
[connection start];
这些行会触发这些代表下载数据。
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
[received_data setLength:0];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[received_data appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
//Use your download image
imageView.image = [UIImage imageWithData:received_data];
}
答案 3 :(得分:0)
使用AFNetworking可以让您获得更好的感觉。作为项目的一部分,有UIImageView
类别将插入临时图像,同时切换到后台线程以下载真实图像。
这样可以防止图像下载锁定主线程。下载图像后,临时图像将被换出。
这是一个很好的教程,其中包含有关使用UIImageView
类别AFNetworking crash course的一些建议。
答案 4 :(得分:0)
我在这里写了一个答案:
https://stackoverflow.com/a/14624875/1375695
解释了如何使用Grand Central Despatch在您的图像在后台下载时保持桌面平滑滚动。该答案并未强制要求使用第三方库。虽然 - 正如Andrew和Flexaddicted所提到的那样 - 有些库可以为您提供解决方案 - 但它可能值得一读,以便您可以了解需要在幕后发生的事情。
请注意,在我提出的解决方案中,您仍然可以使用同步方法从网络中实际获取数据:
UIImage *image = [UIImage imageWithData:
[NSData dataWithContentsOfURL:
[NSURL URLWithString:
[dictionary objectForKey:@"image"]]]];
因为它将在异步后台线程上调用。
答案 5 :(得分:0)
我强烈推荐AFNetworking框架,因为@flexaddicted建议(UIImageView+AFNetworking
)。另外,请查看Sensible TableView框架。它应该能够自动从Web服务获取所有数据并在表视图中显示它们,并且还将自动处理所有异步图像下载。应该为你节省大量的工作。
答案 6 :(得分:0)
为了更方便下载图像,请使用EGOImageLoader / EGOImageView 通过此链接下载此课程