iOS таблица с низкой производительностью - PullRequest
0 голосов
/ 11 марта 2012

Я действительно в тупике.У меня есть таблица с uilabels и изображениями.Загрузка изображений с помощью библиотеки HJcache.Все работает отлично, но очень очень медленно, вот мой код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *currentCellId = @"currentCell";
NSUInteger currentRow = [indexPath row];
HJManagedImageV* currentImage;
UILabel *textLabel;
UIImageView *onlineStatusView;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:currentCellId];

if (cell == nil) {
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:currentCellId];
    currentImage = [[HJManagedImageV alloc] initWithFrame:CGRectMake(2,2,40,40)];
    [currentImage setTag:999];
    [cell addSubview:currentImage];
    textLabel = [[UILabel alloc] initWithFrame:CGRectMake(50.0f, 2.0f, cell.frame.size.width - 50.0f, cell.frame.size.height-4.0f)];
    [textLabel setTag:777];
    [textLabel setFont:[UIFont boldSystemFontOfSize:12.0f]];
    [cell addSubview:textLabel];
    if ([[[dataArray objectAtIndex:currentRow] objectForKey:@"online"] integerValue] == 1){
        onlineStatusView = [[UIImageView alloc] initWithFrame:CGRectMake(cell.frame.size.width-15.0f,
                                                                         cell.frame.size.height/2,
                                                                         10.0f,
                                                                         10.0f)];
        [onlineStatusView setTag:888];
        [cell addSubview:onlineStatusView];
    }
} else{
    onlineStatusView = (UIImageView *)[cell viewWithTag:888];
    textLabel = (UILabel *)[cell viewWithTag:777];
    currentImage = (HJManagedImageV*)[cell viewWithTag:999];
    [currentImage clear];
}

currentImage.url = [NSURL URLWithString:[[dataArray objectAtIndex:currentRow] objectForKey:@"image"]];
[cache manage:currentImage];
[currentImage setOpaque:YES];
currentImage = nil;

NSString *nameString = [NSString stringWithFormat:@"%@ %@",
                  [[dataArray objectAtIndex:currentRow] objectForKey:@"firstName"],
                  [[dataArray objectAtIndex:currentRow] objectForKey:@"lastName"]];
[textLabel setText:nameString];
[textLabel setOpaque:YES];
textLabel = nil;

if (onlineStatusView){
    [onlineStatusView setImage:[UIImage imageNamed:@"Online@2x.png"]];
    [onlineStatusView setOpaque:YES];
    onlineStatusView = nil;
}

return cell;

}

Все выглядит довольно хорошо, я удалил все ненужные выделения, кэшированные изображения, но все безрезультатно.Что я делаю не так?

ps сейчас у меня около 200 строк, но ошибки начинаются, когда было 20. Думаю, моя ошибка действительно глупая.

Ответы [ 2 ]

1 голос
/ 11 марта 2012

Пара вопросов здесь:

  • вы устанавливаете currentImage на непрозрачный до того, как он существует, так что это не имеет никакого эффекта. Сделайте это после того, как вы создадите и добавите изображение в свою ячейку в качестве подпредставления
  • вы все время создаете новые ярлыки. Они должны быть добавлены только один раз, как ваш currentImage, и просто изменить текст
  • то же самое относится и к просмотру статуса онлайн. Создайте его один раз, когда сделаете ячейку, и просто сделайте ее скрытой или нет, в зависимости от вашей модели.

Я не знаю, какую библиотеку вы используете, поэтому не могу комментировать это.

0 голосов
/ 11 марта 2012

Вставьте несколько NSLog () в ваш кеш: управляйте вызовами, чтобы увидеть, как долго они действительно продолжаются.Не беспокойтесь о ваших 200 строках, cellForRowAtIndexPath вызывается только для видимых строк.

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