1

我的 UITableView 在将消息(内容)加载到单元格后,滚动时会出现非常明显的延迟,有时会冻结几秒钟。这很奇怪,因为一旦用户滚动就会加载所有消息。关于如何使这种快速滚动没有问题的任何想法?

谢谢!

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *simpleTableIdentifier = @"MailCell";

    MailCell *cell = (MailCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MailCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];

        // Anything that should be the same on EACH cell should be here.

        UIView *myBackView = [[UIView alloc] initWithFrame:cell.frame];
        myBackView.backgroundColor = [UIColor colorWithRed:40.0/255.0 green:148.0/255.0 blue:196.0/255.0 alpha:1];
        cell.selectedBackgroundView = myBackView;

        cell.messageText.textAlignment = NSTextAlignmentLeft;
        cell.messageText.lineBreakMode = NSLineBreakByTruncatingTail;
    }

    NSUInteger row = [indexPath row];

    // Extract Data

    // Use the message object instead of the multiple arrays.

    CTCoreMessage *message = [[self allMessages] objectAtIndex:row];

    // Sender

    CTCoreAddress *sender = [message sender];
    NSString *senderName = [sender name];

    // Subject

    NSString *subject = [message subject];
    if ([subject length] == 0)
    {
        subject = @"(No Subject)";
    }

    // Body

    BOOL isPlain = YES;
    NSString *body = [message bodyPreferringPlainText:&isPlain];
    body = [[body componentsSeparatedByCharactersInSet:
             [NSCharacterSet whitespaceAndNewlineCharacterSet]]
            componentsJoinedByString:@" "];
    body = [body stringByReplacingOccurrencesOfString:@"  " withString:@" "];

    // Populate Cell

    [[cell nameText] setText:senderName];
    [[cell subjectField] setText:subject];
    [[cell messageText] setText:body];

    if ([message isUnread])
    {
        cell.nameText.textColor = [UIColor colorWithRed:15.0/255.0 green:140.0/255.0 blue:198.0/255.0 alpha:1];
    }
    else
    {
        cell.nameText.textColor = [UIColor blackColor];
    }

    return cell;

}
4

2 回答 2

2

xCode 带有一个称为 Instruments 的分析器。它的 CPU 时间分析器非常适合找出哪些代码正在减慢速度。使用分析器运行您的应用程序并花几秒钟滚动浏览。它会给你统计数据。

请记住,里面的代码if (cell == nil)将运行大约 10 次(UITableView 缓存的单元格刚好够自己填充)。但是 if 之外的代码很昂贵 - 每次单元格变得可见时它都会运行。

我猜您发布的代码中最昂贵的操作是:

给 iOS 太多子视图以在单元格上绘制

  • 而是做你自己的画。

用单个空格替换整个正文文本中的空白运行

  • 您发布的代码为每个单词分配了新的字符串,加上一个数组来保存它们。然后它再分配两个副本(一个带有重新连接的单词,另一个带有压缩的空格)。它处理整个正文文本字符串,即使用户永远不会在正文的微小预览中看到大部分内容!
  • 缓存结果字符串,以便每个单元格仅执行一次此操作。
  • 此外,您可以创建一个新的可变字符串,在其中保留空间,并在循环中从原始字符串复制字符(空格除外)。您可以停止在 100 个字符左右(足以填充表格单元格),而不是处理整个正文文本。更快,节省内存。

UITableView 滚动缓慢是一个非常常见的问题。请参阅:
如何解决 UITableView 中缓慢滚动的问题
iPhone UITableView 使用自定义单元格时出现口吃。我怎样才能让它平滑滚动?

于 2013-05-27T21:06:55.583 回答
-3

您的代码似乎没有任何问题。我建议使用免费的 Sensible TableView 等表优化框架。

于 2013-05-27T20:49:53.923 回答