【问题标题】:The right approach to loading dynamic content into a UITableView in iOS在 iOS 中将动态内容加载到 UITableView 的正确方法
【发布时间】:2012-04-03 21:08:31
【问题描述】:

好的,我已经阅读了大量关于将动态内容(来自网络)加载到 UITableView 以及预先计算单元格高度的问题。我尝试了不同的简单实现,但问题仍然存在......

假设我需要从网上读取一个 JSON 文件,将其解析为“项目”对象,每个对象都有可变大小的图像和各种文本标签,我认为这是避免长时间挂起的正确方法加载所有内容时应用的时间:

  1. 在应用加载时读取 JSON 文件并解析为 items 数组
  2. 仅向 tableview 提供项目数组的一小部分(大约 10 个项目) - 因为我需要加载与每个项目关联的图像来计算单元格高度 - 我不希望视图遍历整个项目列表并加载所有图片 - 这会挂起应用,直到每张图片都加载完毕
  3. 显示带有可用单元格的表格视图(假设我加载了一些“备用”单元格,用户甚至可以滚动到更多项目)
  4. 在后台使用 Grand Central Dispatch 为所有/部分剩余项目下载图像,然后使用新数据重新加载 tableview(如果项目列表很长,请重复第 4 步)

上面的第 2 步是必要的,因为我无法在不先加载图像的情况下计算单元格高度,而且由于 tableview 首先计算所有单元格的高度,因此下载所有项目的所有图像可能需要很长时间。

您认为这是正确的方法吗?我错过了什么吗?

【问题讨论】:

    标签: iphone objective-c ios uitableview


    【解决方案1】:

    为什么不在表格视图中标准化图像大小。然后,您可以在显示图像时对其进行操作以适应大小。如果选择,提供查看图像的方法。 Quartzcore 框架将允许您获取原始图像并调整它们的大小。

    我之所以这么建议,是因为它会让你的 tableview 在统一的图片尺寸下看起来比随机的更有吸引力。

    【讨论】:

    • 同意。采用 Flickr 方法并将它们裁剪为统一的正方形大小。
    【解决方案2】:

    您说得对,节目必须继续进行,即使您的数据仍在加载。因此,您需要设计一个在具有正确图像之前看起来很有吸引力的单元格。一种常见的方法是发送默认图像并格式化单元格以使其看起来不错。

    为了处理高度,tableView 数据源协议可以询问您单元格的高度。回答的方式是,用伪代码:

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    
      id myModelElement = [self.myModel objectAtIndex:indexPath.row];
      UIImage *image = myModelElement.image;
      if (!image) image = self.placeholderImage;
    
      return kFIXED_HEIGHT + image.size.height;
    }
    

    您希望异步加载图像也是正确的。 See my answer here 一个非常简单的方法。没有 GCD,甚至没有重新加载表行。

    【讨论】:

    • Danh,如果我在 heightFor 中计算单元格高度...那么我必须首先加载所有图像...这就是我要避免的
    • 对,你可能还没有加载图像,但你仍然需要一个行高。这就是为什么我建议使用占位符的原因 - 在您的应用程序包中提供的图像在真实图像出现之前看起来很漂亮。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2017-05-05
    相关资源
    最近更新 更多