首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何提高UITableView的速度?

如何提高UITableView的速度?
EN

Stack Overflow用户
提问于 2011-05-30 12:00:39
回答 9查看 11.2K关注 0票数 16

我有一个包含200个部分的大约400个单元格的UITableView,它对用户交互(滚动、选择单元格)的响应速度有点慢。我已经确保了用于检索单元格和标题视图的方法在运行时达到了最低限度,并且我不认为我正在做任何不寻常的事情来使它变慢。单元格和标题只有一个背景图像和文本。有没有其他人遇到过这种问题,你知道有什么方法可以让它运行得更快吗?

编辑:我提供赏金,因为我想得到一些有用的反馈。我不认为答案在于我的代码中存在问题。相反,我正在寻找重新设计UITableView的策略,以便它运行得更快。我完全对添加新代码持开放态度,我期待着听到你们的意见。

在模拟器和我的设备iPhone 4上都可以观察到速度缓慢。下面是我的viewForHeaderInSectioncellForRowAtIndexPath的实现,它们是仅有的几个非常重要的UITableViewDelegate方法。我重用了单元格和标题视图。

代码语言:javascript
复制
- (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;
}
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-06-23 17:42:39

即使您的单元格实际上很简单(背景图像和标签),也有一些事情需要考虑

图像缓存这是一件显而易见的事情-如果你在任何地方都使用相同的图像,那么将它加载到UIImage中并重用它。即使系统会自己缓存它,直接使用已经加载的缓存也不会有什么坏处。

快速计算另一个相当明显的事情-让计算高度和内容尽可能快。不要进行同步获取(网络调用、磁盘读取等)。

图像中的Alpha通道在绘制时最昂贵的是透明度。由于您的单元格背景后面没有任何内容,因此请确保您保存的图像没有alpha通道。这节省了大量的处理时间。

透明标签同样适用于背景视图顶部的标签,不幸的是,使其不透明可能会破坏细胞的外观-但这取决于图像。

自定义单元格一般来说,自己创建UITableViewCell子类并实现drawRect:比构建子视图层次结构更快。您可以使您的图像成为所有实例都使用的类变量。在drawRect:中,您将在其上面绘制图像和文本。

Check compositing模拟器有一个工具,可以高亮显示由于透明度而渲染成本高昂的部分(绿色可以,红色是alpha混合)。它可以在调试菜单中找到:“颜色混合层”

票数 50
EN

Stack Overflow用户

发布于 2011-06-21 12:51:58

如果你想要加速你的代码,你能做的最好的事情就是分析它。这有两个原因:

  1. 你可以读到一些能从总体上提高表格性能的东西,比如使用固定高度的单元格和重用单元格,这可能会对实现这些东西有所帮助(看起来你已经做到了)。但是,当涉及到加速你的代码时,你真的需要知道你的应用程序在哪里花费了大部分时间。可能有一些方法需要很长的时间,或者一个方法相对较快,但调用的频率比你预期的要高得多。
  2. 除非你有一些数字可以衡量,否则你不可能知道你为了加快速度所做的改变是否真的有影响。如果你能证明你的代码在一个例程中花费了80%的时间,而你把它减少到了35%,那么你就知道你正在取得进展。

所以,打开仪器,开始测量吧。如果你可以,在你做你想要加速的每一个不同的活动时进行测量是一个好主意。在滚动时执行一次性能分析会话,在固定时间段内选择尽可能多的不同单元格,等等。不要忘记保存结果,以便稍后进行比较。

票数 9
EN

Stack Overflow用户

发布于 2011-05-30 12:22:18

只需注意以下几点。

你是不是重用了cells..Which是一个很好的做法去做..

  • 确保你在cellForRowAtIndexPath回调中没有做任何昂贵的计算,或者在一个从CellForRowAtIndexPath..

  • You调用的函数中有一个背景图像。必须重用单元格的另一个原因。

关于单元重用的一些好信息是here

编辑:发现此页的时间很晚..

SO question线程可能有助于you...especially接受的答案...

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6172158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档