我在表视图中加载带有数据的图像。图像来自网络。我创建了在模型类中获取图像url的方法。模型类具有Nsdictionary和对象。 但是这个图像正在减慢滚动速度。这是我的代码
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",
[(Tweet *)[recentTweets objectAtIndex:indexPath.row]urlString]]]]];
cell.imageView.image = image;
请告诉我哪里出错?
答案 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 loading和do 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方法时,显示加载图像,直到图像在数组中。