我有一个自定义的UITableViewCell,它由UIImageView和UILabel组成。单元格为320x104px,imageView占据整个区域,标签位于前面。只有8个细胞。
在ViewDidLoad中我正在创建所有需要的图像,并在字典中以正确的尺寸缓存它们。
当我滚动UITableView时,每次遇到新单元格时都会有明显的延迟。这对我来说毫无意义,因为它正在使用的图像已经被创建和缓存。所有我要求的单元格都是为了让UIImageView渲染图像。
我在xib中使用自定义单元格及其视图,并将我的UITableView配置为使用它:
[self.tableView registerNib:[UINib nibWithNibName:@“ActsCell”bundle:nil] forCellReuseIdentifier:myIdentifier];
细胞创建和配置:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString* reuseIdentifier = @"ActsCell";
ActsCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
// Configure the cell...
[self configureCell:cell atIndexPath:indexPath];
return cell;
}
- (void)configureCell:(ActsCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
Act* act = [self.acts objectAtIndex:indexPath.row];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.title.text = act.name;
cell.imageView.image = [self.imageCache objectForKey:act.uid];
}
可能导致滞后的原因是什么?在完成所有时间密集型工作时,尝试执行任何异步操作似乎没有任何好处。
答案 0 :(得分:31)
您是否有机会从本地文件加载图像?
通过使用Instruments我发现UIImage
中存在一些延迟加载机制 - 实际图像数据仅在主线程上呈现它的阶段从PNG解压缩,这导致滚动期间的延迟。
因此,在使用UIImage
方法加载-initWithContentsOfFile:
之后,我添加了代码以将此图像的内容呈现到屏幕外的上下文,将该上下文保存为新的UIImage
并使用对UIImageView
UITableViewCell
中的UIImage *productImage = [[UIImage alloc] initWithContentsOfFile:path];
CGSize imageSize = productImage.size;
UIGraphicsBeginImageContext(imageSize);
[productImage drawInRect:CGRectMake(0, 0, imageSize.width, imageSize.height)];
productImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
而言,这使得卷轴再次平滑且令人愉悦。
如果有参考,我会使用简单的代码强制在单独的线程中读取图像内容(使用ARC):
UIImage
我认为以这种方式创建的UIGraphicsGetImageFromCurrentImageContext()
的表面将采用适合渲染的支持格式,这也将卸载在主线程上渲染它所需的工作。
编辑:UIGraphics..
的文档说它应该只在主线程中使用,但在网上搜索或者SO显示从iOS 4开始{{1}}方法变得线程安全。