我正在使用一些NSArrays加载一个tableview,该单元格包含两个标签和一个加载了URL图像的背景图像视图。问题是tableview的滚动速度很慢,就像冻结一样....我认为这是因为Imageview但我该怎么做???
继承了我的一些代码,你可以看到:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return _Title.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
MyCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
int row = [indexPath row];
cell.TitleLabel.text = _Title[row];
cell.DescriptionLabel.text = _content[row];
cell.CellImageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:_ImageUrl[row]]]];
cell.CellImageView.contentMode = UIViewContentModeTop;
cell.CellImageView.contentMode = UIContentSizeCategoryMedium;
cell.backgroundColor = [UIColor clearColor];
return cell;
}
有关额外信息,此tableview会显示一个具有相同信息的Detailviewcontroller。
答案 0 :(得分:5)
异步加载图像(在图像进入时加载图像)。查看优秀的课程,例如SDWebImage
https://github.com/rs/SDWebImage
答案 1 :(得分:1)
您使用以下代码行阻止主线程:
cell.CellImageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:_ImageUrl[row]]]];
我的建议是使用AFNetworking并将代码替换为以下内容:
[cell.cellImageView setImageWithURL:[NSURL URLWithString:@"http://example.com/image.png"]];
此外,您的指针应以小写字母开头。例如,CellImageView应该是cellImageView。
答案 2 :(得分:1)
要扩展@vborra的答案 - 你的tableview缓慢的原因是(在你的代码中)整个图像必须在显示之前完成下载。
这是因为dataWithContentsOfURL:
是一种同步方法。您需要使用异步API在后台下载图像,并在完成下载后将其显示在屏幕上。
以下是适用于您的示例的github页面的代码段。确保将文件夹SDWebImage及其内容从https://github.com/rs/SDWebImage添加到您的项目中。
#import <SDWebImage/UIImageView+WebCache.h>
...
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
MyCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
int row = [indexPath row];
cell.TitleLabel.text = _Title[row];
cell.DescriptionLabel.text = _content[row];
[cell.CellImageView setImageWithURL:[NSURL URLWithString:_ImageUrl[row]]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
cell.CellImageView.contentMode = UIViewContentModeTop;
cell.CellImageView.contentMode = UIContentSizeCategoryMedium;
cell.backgroundColor = [UIColor clearColor];
return cell;
}
注意,如果您要下载所有不同尺寸的图像,最终可能会调整问题大小,这也会降低您的性能。 SDWebImage页面有一个指向文章的链接,以便在遇到此问题时帮助您解决此问题。 http://www.wrichards.com/blog/2011/11/sdwebimage-fixed-width-cell-images/
使用透明度和表格视图时,您可能还会遇到性能提升,但这取决于代码的其余部分。
AFNetworking是一款非常出色的工具,但如果您在应用中的其他任何地方都没有使用网络网络,那么它可能会过度使用。
答案 3 :(得分:1)
您从[NSData dataWithContentsOfURL:[NSURL URLWithString:_ImageUrl[row]]]
致电cellForRowAtIndexPath
,这不是个好主意。因为每次加载UITableViewCell
时它都会进入服务器。
您必须使用异步图片加载&amp;缓存。这些库可能对您有所帮助:(我个人最喜欢的是SDWebImage
)
1)https://github.com/rs/SDWebImage
2)https://github.com/nicklockwood/AsyncImageView
此外,您可以参考示例代码 Apple 关于LazyTableImages
- https://developer.apple.com/library/ios/samplecode/LazyTableImages/Introduction/Intro.html
<强>更新强>
对于SDWebImage
,请按照本指南操作。这非常好。
http://iosmadesimple.blogspot.in/2013/04/lazy-image-loading.html
答案 4 :(得分:-2)
像这样加载您的图片
//get a dispatch queue
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//this will start the image loading in bg
dispatch_async(concurrentQueue, ^{
NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:mapUrlStr]];
//this will set the image when loading is finished
dispatch_async(dispatch_get_main_queue(), ^{
cell.CellImageView.image = [UIImage imageWithData:imageData]
});
});