uitableViewcell中的UIImage减慢滚动表

时间:2011-04-30 12:40:22

标签: iphone uitableview uiimage

我在表视图中加载带有数据的图像。图像来自网络。我创建了在模型类中获取图像url的方法。模型类具有Nsdictionary和对象。 但是这个图像正在减慢滚动速度。这是我的代码

UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",
                                                                                        [(Tweet *)[recentTweets objectAtIndex:indexPath.row]urlString]]]]];
cell.imageView.image = image;

请告诉我哪里出错?

5 个答案:

答案 0 :(得分:2)

这是我用于从远程位置将图像加载到UITableView的方法:

在你的.h文件中,声明一个可变字典来存储图像:

 NSMutableDictionary *images; 

在-init ...或-viewDidLoad

中初始化字典
images = [[NSMutableDictionary alloc]init];
在.m,tableView:cellForRowAtIndexPath:中的

,查看您的字典中是否存在indexPath的图像

UIImage *img = [images objectForKey: indexPath];

如果图像确实存在,只需设置它。

if (img) cell.imageView.image = img;

如果图像不存在,请将单元格的图像设置为临时图像...

if (!img) cell.imageView.image = [UIImage imageNamed:@"imageUnavailable.png"];

并将该图像添加到您的字典中,这样如果您在加载之前滚动并返回该图像,它就不会尝试重新获取图像...

[images setObject:[UIImage imageNamed:@"imageUnvailable.png"] forKey: indexPath];

然后,在同一个块中,使用NSOperationQueue和自定义NSOperation(这里是一个引用 - NSOperation and SetImage)来获取您的图像并使用该图像回调到您的UITableViewController。

在你的回调中

,将你的图像添加到字典中(覆盖临时图像)并调用[tableView reloadData]

这将为您提供良好的非阻止用户体验。

答案 1 :(得分:2)

使用lazy loadingdo your own drawing。尝试了解我链接的示例项目的技术。这些是提高图像表性能的最佳方法。

答案 2 :(得分:2)

有两种方法可以做到这一点。我有一个HttpRequests队列的最佳体验,我在滚动过程中暂停了。

我强烈推荐这个框架: http://allseeing-i.com/ASIHTTPRequest/

我还实现了一个图像缓存,只有在缓存中没有图像时才加载图像。

最后的调整是实际绘制图像而不是像UIImageView那样使用高级uicomponent

答案 3 :(得分:1)

您的代码现在变慢的首要原因是因为您正在主线程上进行网络调用。这会阻止UI更新,并阻止操作系统处理事件(如点击)。

如前所述,我推荐ASIHTTPRequest。将异步请求与具有较小并发计数(例如2)的NSOperationQueue组合,用于图像请求,缓存以及在图像进入时(在主线程上)重新加载行(如果当前可见,则仅重新加载行)。您可以获得平滑的滚动表视图。

我在github上有一个例子:https://github.com/subdigital/iphonedevcon-boston

它位于有效网络编程项目中,包括一系列逐步改善体验的项目。

答案 4 :(得分:0)

在加载tableView之前下载图像,并将它们存储在NSArray中。然后,当调用cellForRowAtIndexPath方法时,显示加载图像,直到图像在数组中。