我正在从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];
}];
答案 0 :(得分:0)
看起来您已经获得了呈现单元格所需的大部分数据,但AppIcon.image
中的图像除外。现在设置的方式,图像下载阻止您立即呈现单元格。我的猜测是图像下载最终会完成,但是下载完成后你不会强制单元格重绘。点击一个单元格会强制它重绘自己,这可能就是你看到你所描述的行为的原因。
我建议您使用已下载的数据立即显示单元格,然后启动图像的后台下载。下载完成后,您可以发送NSNotification并更新相应的单元格。您可以通过创建NSOperation的子类来执行此操作,该子类在初始化期间接受URL,然后将该op添加到操作队列
如果您不想自己完成所有工作,UIImageView上有一个类别,它使用AFNetworking为您使用块进行更新。 https://github.com/zbowling/AFNetworkingPollTest/blob/master/ServerTest/UIImageView%2BAFNetworking.h
答案 1 :(得分:0)
正如@Nick Galasso所说 - 你不刷新单元格并将单元格指针传递给一个块是一个非常糟糕的做法,因为UITableView
实际上重用了单元格,当下载完成时你应该获得单元格指针再次 - 您对实际NSIndexPath
下的单元格感兴趣,而不是对象。
在链接下: https://developer.apple.com/library/ios/samplecode/LazyTableImages/Introduction/Intro.html
你可以在延迟图像加载上找到完美的示例代码,下面的片段显示了实际带来视图的部分,这个代码在下载完成时设置了图像asap:
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
cell.imageView.image = downloadedImage;
您可以在下载课程的某个完成处理程序中调用它(Apple链接下的示例包含该内容)。