下载单元格图像后,UITableView滚动速度慢

时间:2013-05-13 20:55:51

标签: ios objective-c uitableview uiimage

我正在尝试从服务器下载一些缩略图,然后在每个单元格中显示它们:

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

但下载并显示图像后,表格视图会慢慢滚动!

7 个答案:

答案 0 :(得分:3)

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

如果在主线程上运行此操作,则应避免此类交互。该线程将被冻结,用户将失望;)

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

两者都有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 通过此链接下载此课程

https://github.com/enormego/EGOImageLoading