0

I am trying to download some thumbnail from server and then display them in each cell :

// 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)];    

but after downloading and displaying images, the table view scrolls slowly!

4

7 回答 7

3

主要问题是该[NSData dataWithContentsOfURL:]方法是同步请求。它阻塞正在运行的线程,直到请求完成。

如果你在主线程上运行它,你应该避免这种类型的交互。该线程将被冻结,用户将感到失望;)

你有很多解决方案。一个简单的方法是使用SDWebImageAFNetworking等第三个库。

两者都有围绕UIImageView类的类别,允许以简单的方式使用它们。例如,使用UIImageView+AFNetworking您应该执行以下操作:

[cell.imageView setImageWithURL:yourURL placeholderImage:yourPlaceholderImage];
于 2013-05-13T21:12:24.887 回答
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
    }

}];

这将进行异步调用,并在加载表格视图后加载图像,即当图像加载完成时,图像将显示,但在需要加载表格视图时加载表格。

于 2013-10-18T11:11:49.353 回答
1

直接这样使用

UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[dictionary objectForKey:@"image"]]]];

它占用主线程,因此在下载图像之前无法滚动。因此,您添加 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];    
}
于 2013-10-23T07:09:16.350 回答
0

我强烈推荐@flexaddicted 推荐的AFNetworking 框架(UIImageView+AFNetworking)。另外,请查看 Sensible TableView 框架。它应该能够自动从 Web 服务获取所有数据并将它们显示在表格视图中,并且还将自动处理所有异步图像下载。应该为您节省大量工作。

于 2013-05-14T00:00:42.577 回答
0

我在这里写了一个答案:

https://stackoverflow.com/a/14624875/1375695

它解释了如何使用 Grand Central Despatch 在后台下载图像时保持表格平滑滚动。该答案不要求使用 3rd 方库。虽然 - 正如 Andrew 和 Flexaddicted 所提到的 - 有一些库可以为您提供解决方案 - 它可能值得一读,以便您了解需要发生的事情。

请注意,在我提出的解决方案中,您仍然可以使用同步方法实际从网络获取数据:

    UIImage *image = [UIImage imageWithData:
                      [NSData dataWithContentsOfURL:
                       [NSURL URLWithString:
                        [dictionary objectForKey:@"image"]]]];

因为它将在异步后台线程上调用。

于 2013-05-13T23:17:14.130 回答
0

为了更方便下载图像,请使用 EGOImageLoader/EGOImageView 通过此链接下载此类

https://github.com/enormego/EGOImageLoading

于 2013-10-23T07:13:50.303 回答
0

使用 AFNetworking 会让您感觉更好。作为项目的一部分,有一个UIImageView类别将插入临时图像,同时切换到后台线程以下载真实图像。

这将防止图像下载锁定主线程。下载图像后,将为您换出临时图像。

这是一个很好的教程,其中包含一些关于使用UIImageViewAFNetworking速成课程的指导。

于 2013-05-13T21:02:03.763 回答