Оптимизация создания пользовательских UITableViewCell - PullRequest
1 голос
/ 25 июня 2011

У меня есть следующий код, который просто создает пользовательский UITableViewCell. Я создаю динамическую высоту строки, это дорого? Любой способ оптимизировать это?

Я также изменяю размер рамки одного из моих ярлыков в cellForRow. Есть ли способ оптимизировать это?

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MessageCell *cell = (MessageCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath];
    return cell.bodyLabel.bounds.size.height + 30;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"MessageCell";

    MessageCell *cell = (MessageCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[MessageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.usernameLabel.text = [[items objectAtIndex:indexPath.row]valueForKey:@"user_login"];
    cell.bodyLabel.text = [[[items objectAtIndex:indexPath.row]valueForKey:@"body"]gtm_stringByUnescapingFromHTML];
    [Utils alignLabelWithTop:cell.bodyLabel];
    cell.dateLabel.text = [Utils toShortTimeIntervalStringFromStockTwits:[[items objectAtIndex:indexPath.row]valueForKey:@"created_at"]]; 
    [cell.avatarImageView reloadWithUrl:[[items objectAtIndex:indexPath.row]valueForKey:@"avatar_url"]];

    return cell;
}

1 Ответ

8 голосов
/ 25 июня 2011
  • Динамическая высота строки стоит дорого, потому что она не может эффективно кэшировать визуализированные представления, поскольку среда выполнения не знает, какую высоту вы собираетесь вернуть для данной ячейки, пока не выполнит вызов.Избавьтесь от этого, если это вообще возможно.Я сказал инженерам Apple, что эффективнее нарисовать все ячейки немного выше, чем необходимо для учета нескольких больших строк, чем использовать динамическую высоту.
  • Кэшировать объект, возвращаемый [items objectAtIndex:indexPath.row]
  • Я не знаю достаточно о вашем cell.avatarImageView, но если он не выполняет некоторое кэширование изображения на основе URL-адреса, он будет вызывать Интернет или файловую систему, чтобы каждый раз перезагружать это изображениеячейка отображается.Попробуйте EGOImageView стек , он эффективно кэширует свое изображение и представляет собой довольно приятный код.
  • Пока вы находитесь в коде EGO Github, захватите их EGOCache и используйте его для кэширования некоторыхдругие значения, которые вы должны проанализировать, такие как текст bodyLabel
  • Если какие-либо ваши взгляды на эту ячейку являются прозрачными, посмотрите видео WWDC 2011 о производительности UIKit.У них есть намного более эффективный метод рисования прозрачности в ячейках табличного представления
  • Почему вы меняете расположение метки на лету - вызов [Utils alignLabelWithTop:]? *

Также посмотрите видео WWDC об использовании инструментов, они узнают, как найти код рисования, который убивает производительность.В этом году было несколько (не все) действительно классных сессий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...