我有一个包含200个部分的大约400个单元格的UITableView,它对用户交互(滚动、选择单元格)的响应速度有点慢。我已经确保了用于检索单元格和标题视图的方法在运行时达到了最低限度,并且我不认为我正在做任何不寻常的事情来使它变慢。单元格和标题只有一个背景图像和文本。有没有其他人遇到过这种问题,你知道有什么方法可以让它运行得更快吗?
编辑:我提供赏金,因为我想得到一些有用的反馈。我不认为答案在于我的代码中存在问题。相反,我正在寻找重新设计UITableView的策略,以便它运行得更快。我完全对添加新代码持开放态度,我期待着听到你们的意见。
在模拟器和我的设备iPhone 4上都可以观察到速度缓慢。下面是我的viewForHeaderInSection
和cellForRowAtIndexPath
的实现,它们是仅有的几个非常重要的UITableViewDelegate
方法。我重用了单元格和标题视图。
- (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger) section
{
HaikuHeaderView* view= [m_sectionViews objectAtIndex:section];
NSMutableArray* array= [m_haikuSearch objectAtIndex:section];
Haiku* haiku= [array objectAtIndex:0];
[view.poetLabel setText:[haiku nameForDisplay]];
return view;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
cell.backgroundView= [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cell gradient2.png"]];
// (Set up a bunch of label attributes in the cell...)
}
NSMutableArray* array= [m_haikuSearch objectAtIndex:indexPath.section];
Haiku* haiku = [array objectAtIndex:indexPath.row];
cell.textLabel.text = [haiku.m_lines objectAtIndex:0];
return cell;
}
发布于 2011-06-23 17:42:39
即使您的单元格实际上很简单(背景图像和标签),也有一些事情需要考虑
图像缓存这是一件显而易见的事情-如果你在任何地方都使用相同的图像,那么将它加载到UIImage中并重用它。即使系统会自己缓存它,直接使用已经加载的缓存也不会有什么坏处。
快速计算另一个相当明显的事情-让计算高度和内容尽可能快。不要进行同步获取(网络调用、磁盘读取等)。
图像中的Alpha通道在绘制时最昂贵的是透明度。由于您的单元格背景后面没有任何内容,因此请确保您保存的图像没有alpha通道。这节省了大量的处理时间。
透明标签同样适用于背景视图顶部的标签,不幸的是,使其不透明可能会破坏细胞的外观-但这取决于图像。
自定义单元格一般来说,自己创建UITableViewCell
子类并实现drawRect:
比构建子视图层次结构更快。您可以使您的图像成为所有实例都使用的类变量。在drawRect:
中,您将在其上面绘制图像和文本。
Check compositing模拟器有一个工具,可以高亮显示由于透明度而渲染成本高昂的部分(绿色可以,红色是alpha混合)。它可以在调试菜单中找到:“颜色混合层”
发布于 2011-06-21 12:51:58
如果你想要加速你的代码,你能做的最好的事情就是分析它。这有两个原因:
所以,打开仪器,开始测量吧。如果你可以,在你做你想要加速的每一个不同的活动时进行测量是一个好主意。在滚动时执行一次性能分析会话,在固定时间段内选择尽可能多的不同单元格,等等。不要忘记保存结果,以便稍后进行比较。
发布于 2011-05-30 12:22:18
只需注意以下几点。
你是不是重用了cells..Which是一个很好的做法去做..
关于单元重用的一些好信息是here。
编辑:发现此页的时间很晚..
此SO question线程可能有助于you...especially接受的答案...
https://stackoverflow.com/questions/6172158
复制相似问题