UITableView 很慢,即使只有几个对象?

Posted

技术标签:

【中文标题】UITableView 很慢,即使只有几个对象?【英文标题】:UITableView slow, even with just a few objects? 【发布时间】:2010-02-15 13:14:39 【问题描述】:
- (void)viewDidLoad 
    [super viewDidLoad];
    [self.tableView setRowHeight:100];
    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    [self.view setBackgroundColor:[UIColor groupTableViewBackgroundColor]];



#pragma mark -
#pragma mark Table view data source

// Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    return 1;



// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    return 3;



// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) 
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectMake(0, 0, 320, 100) reuseIdentifier:CellIdentifier] autorelease];

        // For Name/Phone: 
        UITextField *name = [[[UITextField alloc] initWithFrame:CGRectMake(75, 22, 200, 25)] autorelease];
        [name setFont:[UIFont systemFontOfSize:14]];
        [name setPlaceholder:@"John Doe"];
        [name setReturnKeyType:UIReturnKeyDone];
        [name setAutocapitalizationType:UITextAutocapitalizationTypeWords];
        [name setAutocorrectionType:UITextAutocorrectionTypeNo];
        [name setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];

        UITextField *phone = [[[UITextField alloc] initWithFrame:CGRectMake(75, 67, 200, 25)] autorelease];
        [phone setFont:[UIFont systemFontOfSize:14]];
        [phone setPlaceholder:@"0412 123 123"];
        [phone setReturnKeyType:UIReturnKeyDone];
        //[phone setKeyboardType:UIKeyboardTypePhonePad];
        [phone setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];

        UIImageView *background = [[[UIImageView alloc] initWithFrame:CGRectMake(9, 11, 302, 89)] autorelease];
        background.image = [UIImage imageNamed:@"book-personaldetailsbg.png"];

        // Add to the View
        [cell addSubview:background];
        [cell addSubview:name];
        [cell addSubview:phone];

        // Add actions:
        [name addTarget:self action:@selector(textFieldDone:) forControlEvents:UIControlEventEditingDidEndOnExit]; 
        [phone addTarget:self action:@selector(textFieldDone:) forControlEvents:UIControlEventEditingDidEndOnExit]; 

    

    return cell;

这是有原因的吗?我只设置了几个对象,所以我几乎看不出它为什么会滞后。它跳了起来,它不是我的手机,因为设置应用运行良好。

【问题讨论】:

在模拟器中可以正常工作吗? 是的,在模拟器中完美运行。在 3GS 上也很好用。它并没有慢到让应用程序无法使用,它只是有明显的延迟,这真的很烦人 - 如果修复它会带来更好的用户体验。 估计每个单元格的高度也可能有相同的效果,请检查这个话题***.com/questions/21577976/… 【参考方案1】:

由于手机呈现每一层的方式,具有许多子视图的 UITableViewCell 在 iPhone 上呈现缓慢。

阅读:http://blog.atebits.com/2008/12/fast-scrolling-in-tweetie-with-uitableview/

上述帖子中的信息仍然非常相关和有用,但示例项目下载链接已损坏(截至 2011 年 12 月 8 日)。然而,Apple 自己的表格视图文档已经提供了用于快速滚动日志的平面表格单元格的示例。看看吧:http://developer.apple.com/library/ios/#samplecode/AdvancedTableViewCells/Introduction/Intro.html

主要有以下几点:

iPhone 处理 Alpha 的速度不是很快 子视图应将其opaque 属性设置为YES 如果可能,将子视图绘制到单个不透明视图中以获得最佳性能。

显然,带有需要操作控件的单元格不能被展平,所以我认为您只需要尝试确保您的单元格子视图不透明即可。

我建议的最后一件事是不要在每次请求单元格时分配新对象 - 这肯定是您代码中的瓶颈。您应该使用可重用的单元格,并对单元格进行子类化,以便仅在第一次创建其字段时将其分配和添加为子视图。后续调用应使单元格出列并使用prepareForReuse 清除其旧值。

【讨论】:

是的,自从 Loren 开始为 Twitter 工作以来,他的网站已经被清理过了。我添加了指向 Apple 文档的链接,其中显示了类似的示例。 这个好像已经移到 GitHub 上了:github.com/kevinlawler/fastscrolling Thx~500+ 行的解决方案,快 1.1 秒。【参考方案2】:

我认为您不应该像现在这样设置单元格高度。我相信您应该实现 heightForCellAtIndexPath 方法(可能没有 100% 正确的名称),它会询问您的代表它应该使每个单独的单元格有多高。如果没有以“正确”的方式完成,我觉得我听说过性能问题。恕我直言

如果我是你,我会尝试的第一件事是注释掉所有与图像相关的代码,看看表格是否大幅加速。

【讨论】:

好的,把它换成 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath - 几乎一样。 是的,它看起来是一样的,但从我在互联网上看到的情况来看,这种方法会给你带来更少的问题。 heightForCellAtIndexPath 对于返回可变高度单元格很有用,但是当您有静态高度单元格时,无论您使用此方法还是在表格视图上设置行高属性都没有关系。【参考方案3】:

首先删除该单元格背景。看看会不会有什么不同。

【讨论】:

【参考方案4】:

这里的解决方案家伙,在块内添加要加载的图像,就是这样:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
    dispatch_async(队列,^
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:
                                                      [[feeds objectAtIndex:indexPath.row]
                                                       objectForKey: @"url"]]];
        UIImage *image = [UIImage imageWithData:data];
        dispatch_async(dispatch_get_main_queue(), ^
            cell.imagen.image = 图像;
        );

优先使用 Grand Central Dispatch。 如果有人愿意,我可以解释一下,请发送电子邮件至 info@tonymedrano.com

【讨论】:

以上是关于UITableView 很慢,即使只有几个对象?的主要内容,如果未能解决你的问题,请参考以下文章

表格视图延迟(即使在删除手势识别器后)

Twitter Fabric.io 应用上传速度很慢

RestKit嵌套的一对多关系映射很慢

用软碟通刻录到U盘很慢

为啥我的 UITableView 的“点击编辑”功能很慢?

从 NSData 转换到 UIImage 很慢,阻塞 UITableView