我正在解析JSON文件中的一些图像和字符串,解析工作正常,但图像加载非常慢。我注意到,当我按下UITableViewCell时,UITableView会更快地显示内容。有谁知道解决这个问题的方法吗?
下面是我使用的代码,我使用NSOperationQueue来保持较低的CPU使用率。
NSDictionary *dict;
dict = [application objectAtIndex:indexPath.row];
name = [dict objectForKey:@"name"];
detileName = [dict objectForKey:@"detailName"];
itmsLink = [dict objectForKey:@"itms-serviceLink"];
icon = [dict objectForKey:@"icon"];
developer = [dict objectForKey:@"developer"];
version = [dict objectForKey:@"version"];
category = [dict objectForKey:@"category"];
rating = [dict objectForKey:@"rating"];
ratingNumbers = [dict objectForKey:@"ratingNumber"];
description = [dict objectForKey:@"description"];
developerEmails = [dict objectForKey:@"developerEmail"];
[downloadQueue addOperationWithBlock:^{
cell.AppName.text = name;
cell.category.text = category;
cell.rater.text = [NSString stringWithFormat:@"(%@)", ratingNumbers];
if ([rating intValue] == 1) {
cell.rating.image = [UIImage imageNamed:@"1.png"];
}
if ([rating intValue] == 2) {
cell.rating.image = [UIImage imageNamed:@"2.png"];
}
if ([rating intValue] == 3) {
cell.rating.image = [UIImage imageNamed:@"3.png"];
}
if ([rating intValue] == 4) {
cell.rating.image = [UIImage imageNamed:@"4.png"];
}
cell.itms = itmsLink;
cell.AppIcon.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:icon]]];
cell.number.text = [NSString stringWithFormat:@"%li", (long)indexPath.row + 1];
}];发布于 2013-10-18 02:21:44
看起来您已经获得了显示单元格所需的大部分数据,除了将以AppIcon.image格式显示的图像。按照现在的设置方式,图片下载会阻止你立即展示细胞。我的猜测是,图像下载最终确实会完成,但在下载完成后,您不会强制计算单元重新绘制自身。点击一个单元格会迫使它重新绘制自己,这可能就是为什么你会看到你所描述的行为。
我建议您使用已经下载的数据立即呈现细胞,并启动图像的后台下载。下载完成后,您可以发送NSNotification并更新相应的单元。为此,您可以创建一个在初始化期间接受URL的NSOperation子类,然后将该op添加到您的操作队列中
如果您不想自己完成所有这些工作,UIImageView上有一个类别,它使用AFNetworking使用块为您完成更新。https://github.com/zbowling/AFNetworkingPollTest/blob/master/ServerTest/UIImageView%2BAFNetworking.h
发布于 2013-10-18 03:54:57
正如@Nick Galasso所说的-你不刷新单元格的,将单元格指针传递给一个块是一个非常糟糕的做法,因为UITableView实际上重用了单元格的,当下载完成时,你应该再次获得单元格指针-你感兴趣的是实际NSIndexPath下的单元格,而不是对象。
在一个链接下:https://developer.apple.com/library/ios/samplecode/LazyTableImages/Introduction/Intro.html
你可以找到关于懒惰图像加载的完美示例代码,下面的片段显示了实际带来视图的部分,这段代码调用了下载完成集的图像:
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
cell.imageView.image = downloadedImage;您可以在某个下载类的完成处理程序中调用它( Apple链接下的示例涵盖了这一点)。
https://stackoverflow.com/questions/19434040
复制相似问题