首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UITableViewCell数据加载错误

UITableViewCell数据加载错误
EN

Stack Overflow用户
提问于 2013-10-18 02:06:14
回答 2查看 52关注 0票数 0

我正在解析JSON文件中的一些图像和字符串,解析工作正常,但图像加载非常慢。我注意到,当我按下UITableViewCell时,UITableView会更快地显示内容。有谁知道解决这个问题的方法吗?

下面是我使用的代码,我使用NSOperationQueue来保持较低的CPU使用率。

代码语言:javascript
复制
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];
    }];
EN

回答 2

Stack Overflow用户

发布于 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

票数 0
EN

Stack Overflow用户

发布于 2013-10-18 03:54:57

正如@Nick Galasso所说的-你不刷新单元格的,将单元格指针传递给一个块是一个非常糟糕的做法,因为UITableView实际上重用了单元格的,当下载完成时,你应该再次获得单元格指针-你感兴趣的是实际NSIndexPath下的单元格,而不是对象。

在一个链接下:https://developer.apple.com/library/ios/samplecode/LazyTableImages/Introduction/Intro.html

你可以找到关于懒惰图像加载的完美示例代码,下面的片段显示了实际带来视图的部分,这段代码调用了下载完成集的图像:

代码语言:javascript
复制
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
cell.imageView.image = downloadedImage;

您可以在某个下载类的完成处理程序中调用它( Apple链接下的示例涵盖了这一点)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19434040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档