0

我正在解析 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];
    }];
4

2 回答 2

0

正如@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 链接下的示例涵盖了这一点)。

于 2013-10-17T19:54:56.743 回答
0

看起来您已经获得了呈现单元格所需的大部分数据,但将进入的图像除外AppIcon.image。现在设置的方式,图像下载阻止您立即展示单元格。我的猜测是图像下载最终会完成,但是您不要在下载完成后强制单元格重新绘制自身。点击一个单元格会强制它重新绘制自身,这可能就是您看到您描述的行为的原因。

我建议您立即使用已下载的数据显示单元格,然后开始后台下载图像。下载完成后,您可以发送 NSNotification 并更新相应的单元格。您可以通过创建一个在初始化期间接受 URL 的 NSOperation 子类,然后将该操作添加到您的操作队列中来做到这一点

如果您不想自己完成所有这些工作,UIImageView 上有一个类别,它使用 AFNetworking 使用块为您进行更新。 https://github.com/zbowling/AFNetworkingPollTest/blob/master/ServerTest/UIImageView%2BAFNetworking.h

于 2013-10-17T18:21:43.910 回答