我没有做太多自定义的drawRect
事情,所以我会将问题的那部分推迟给其他人,但通常通过将昂贵的计算移到后台队列中,然后从主队列异步更新单元格,可以更容易地解决 tableview 性能问题后台操作完成时排队。因此,类似:
首先,为tableview定义一个操作队列属性:
@property (nonatomic, strong) NSOperationQueue *queue;
然后在 中viewDidLoad
,初始化:
self.queue = [[NSOperationQueue alloc] init];
self.queue.maxConcurrentOperationQueue = 4;
然后在 中cellForRowAtIndexPath
,您可以:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"MyCellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// Do the quick, computationally inexpensive stuff first, stuff here.
// Examples might include setting the labels adding/setting various controls
// using any images that you might already have cached, clearing any of the
// image stuff you might be recalculating in the background queue in case you're
// dealing with a dequeued cell, etc.
// Now send the slower stuff to the background queue.
[self.queue addOperationWithBlock:^{
// Do the slower stuff (like complex image processing) here.
// If you're doing caching, update the cache here, too.
// When done with the slow stuff, send the UI update back
// to the main queue...
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// see if the cell is still visible, and if so ...
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell)
{
// now update the UI back in the main queue
}
}];
}];
return cell;
}
您可以通过确保将计算昂贵的东西的结果缓存到类似的东西中来进一步优化它 a NSCache
,也许也可以缓存到Documents
或其他地方,因此您可以优化必须完成复杂内容的频率并真正优化用户界面。
而且,顺便说一句,当你这样做时,你现在可以将你的UILabel
(backgroundColor
使用UIColor
0.75 alpha 的黑色)放在顶部UIImageView
,iOS 会为你处理它。尽可能简单。
关于图像分辨率的最后一个问题,您可以:
- 使用视图
contentScaleFactor
来确定您是否正在处理视网膜并相应地调整缩略图图像的大小;或者
- 只需使用 imageview
contentMode
将UIViewContentModeScaleAspectFill
确保您的缩略图图像被正确渲染,无论......如果您使用的是小缩略图图像(甚至是 2x 图像),性能通常很好。