iOS - 我的heightForRowAtIndexPath实现会导致性能问题,为什么?

时间:2014-02-08 17:27:15

标签: ios objective-c performance uitableview

我使用表格视图覆盖heightForRowAtIndexPath。当我运行Xcode探查器时,我发现了以下内容:

enter image description here

我想根据一个对象的属性计算高度。我对两种对象UserPost使用相同的表格视图。我的实现目前看起来像这样:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *text;
    Post *cellPost;
    User *cellUser;
    if (_pageType == FOLLOWERS || _pageType == FOLLOWING) {
        cellUser = [self.users objectAtIndex:indexPath.row];
        text = cellUser.userDescription.text;
        if (text == nil) {
            return 70;
        }
    } else {
        cellPost = [self.fetchedResultsController objectAtIndexPath:indexPath];
        text = cellPost.text;
    }

    CGSize boundingSize = CGSizeMake(245, CGFLOAT_MAX);
    CGSize requiredSize = [text sizeWithFont:[UIFont fontWithName:@"TisaMobiPro" size:15]
                               constrainedToSize:boundingSize
                                   lineBreakMode:NSLineBreakByWordWrapping];
    CGFloat textHeight = requiredSize.height;
    CGFloat cellHeight = textHeight + 40;
    if ([cellPost.text isEqualToString:self.post.text]) {
        cellHeight += 44;
        if (cellHeight < 114) {
            cellHeight = 114;
        }
    } else {
        if (cellHeight < 70) {
            cellHeight = 70;
        }
    }

    if (cellPost.repostedBy != nil && cellPost.youReposted.boolValue == NO && _pageType != CONVERSATION) {
        cellHeight += 27;
    }

    return cellHeight;

}

如果我删除大部分代码并且只有,例如return 100 tableView的滚动性能得到了很大改善。您是否可以发现或植入可能导致此性能问题的植入物的建议?

2 个答案:

答案 0 :(得分:1)

如果您定位到iOS7,则可以使用NSTableView属性:estimatedRowHeight

来自Apple文档:

  

提供行高的非负估计可以改善行   加载表视图的性能。如果表包含变量   高度行,计算所有高度时可能会很昂贵   桌子加载。使用估算可以让您推迟一些成本   从加载时间到滚动时间的几何计算。

另外:

  

每次都是   显示表视图,它调用tableView:heightForRowAtIndexPath:   在每行

的委托上

如果你必须使用tableView:heightForRowAtIndexPath:缓存高度,就像@Waine建议的那样。

答案 1 :(得分:1)


在调用– tableView:cellForRowAtIndexPath:之前和所有单元格数量之前计算高度。
如果您在iOS7上进行部署,则可以使用- tableView:estimatedHeightForRowAtIndexPath:,使用该方法可以在滚动tableview时推迟此计算。这意味着基本上在显示单元格时调用方法tableView:heightForRowAtIndexPath:。估计值可能是接近TVC平均值的固定数字,或者基于某些数学运算速度快于您实施的数字 由于估计,电视可以将其内容大小设置为滚动条高度,并且不需要在一次拍摄中计算100行的每个高度。由于电视正在计算实际的行高,因此回滚可能是滚动期间的延迟。