0

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

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

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

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

你会说这是正确的方法吗?我错过了什么吗?

4

2 回答 2

2

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

我只建议这样做,因为它会使您的 tableview 在统一的图片尺寸下看起来比随机的更有吸引力。

于 2012-04-03T21:41:15.433 回答
0

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

为了处理高度,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;
}

您希望异步加载图像也是正确的。 请在此处查看我的答案,以获得一种非常简单的方法。没有 GCD,甚至没有重新加载表行。

于 2012-04-03T23:25:25.320 回答