【问题标题】:UITableViewCell Data load errorUITableViewCell 数据加载错误
【发布时间】:2013-10-17 18:06:13
【问题描述】:

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

【问题讨论】:

    标签: objective-c uitableview xcode4


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多