UITableView出列单元花费超过0.05秒

时间:2014-06-02 11:16:12

标签: ios uitableview lag

我正在将自定义UITableViewCells队列化,并且iPod第5代所需的时间是天文数字,导致严重的滞后性和非常糟糕的性能

这是我的数据源代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CFTimeInterval startTimeInterval = CACurrentMediaTime();
    if (tableView == self.tableView)
    {
        NSString *identifier = nil;

        if (indexPath.section == RecentUserSection)
        {
            identifier = recentContactCellIdentifier;
        } else if (indexPath.section == GroupsSection) {
            identifier = contactCellIdentifier;
        } else if (indexPath.section == InboxNotificationSection)
        {
            identifier = inboxNotificationCellIdentifier;
        } else {
            identifier = contactCellIdentifier;
        }

        CFTimeInterval startDequeue = CACurrentMediaTime();
        ContactsViewControllerTableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath]; // this is taking 0.05 second
        CFTimeInterval dequeueDuration = CACurrentMediaTime() - startDequeue;

        CFTimeInterval getUserStart = CACurrentMediaTime();
        id user = [[self.sections objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
        CFTimeInterval getUserDuration= CACurrentMediaTime() - getUserStart;

        CFTimeInterval setUserStart = CACurrentMediaTime();
        cell.user = user;
        CFTimeInterval setUserDuration = CACurrentMediaTime() - setUserStart;
        cell.panDelegate = self;
        cell.auxillaryActionsDelegate = self;

        CFTimeInterval duration = CACurrentMediaTime() - startTimeInterval;

        if (duration > 0.016)
        {
            DLog(@"Not realtime - duration = %lf",duration);
            DLog(@"\ndequeue duration = %lf,\nget user duration = %lf,\nset user duration = %lf",dequeueDuration,getUserDuration,setUserDuration);
        }
        return cell;
    }

这是一个示例日志

dequeue duration = 0.055643,
get user duration = 0.000025,
set user duration = 0.002490

我的所有单元格都实现了prepareForReuse,平均时间是:

-(void)prepareForReuse
{
    DLog(@"Reusing tableview cell");
    //doing stuff
    CFTimeInterval duration = CACurrentMediaTime() - startTimeInterval;
    DLog(@"Prepare for reuse time is %lf",duration);


}

日志输出

Prepare for reuse time is 0.001048

所以它必须是UITableView内部的东西 - 我能做些什么吗?我不明白为什么它在iPod上如此之慢,但在iPhone上它的工作速度很快

1 个答案:

答案 0 :(得分:1)

一般的答案是你在显示单元格时进行了太多的计算/计算。最常见的原因是UITableViewCells中的贪婪图像加载。如果您的单元格包含图像,则应该进行某种形式的延迟加载。

如果您的数据来自API,那么检索应该是异步的,但我怀疑这是一个问题,因为它在iPhone上运行良好。如果在单元格中没有渲染图像,那么它可能是由CPU阻塞图形效果造成的,但我再次怀疑这是原因,因为在出​​列函数中可能不会发生延迟。