2016-03-15 3 views
2

Я добавил изображения в таблицу tableView, и это сделало его лагги. Я все еще новичок в объективе c, и я не понимаю, что вызывает это и как его исправить. Любая помощь очень ценится!laggy scrolling tableview с изображениями

group[PF_GROUP_LOGO] - это просто строка в моей базе данных, которая уникальна для каждого объекта. Код работает, он просто сильно отстает при попытке прокрутки.

//------------------------------------------------------------------------------------------------------------------------------------------------- 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
//------------------------------------------------------------------------------------------------------------------------------------------------- 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 
    if (cell == nil) cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"]; 

    PFObject *group = groups[indexPath.row]; 


    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:group[PF_GROUP_LOGO]]]]; 
    cell.imageView.image = image; 

    cell.detailTextLabel.text = [NSString stringWithFormat:@"%d users", (int) [group[PF_GROUP_MEMBERS] count]]; 
    cell.detailTextLabel.textColor = [UIColor lightGrayColor]; 


    return cell; 
} 

ответ

8

Существует так много инструментов, которые могут помочь вам в этом.

На базовом уровне проблема заключается в том, что вы выполняете длительный процесс в основном потоке, который блокирует пользовательский интерфейс. Загрузка изображения с нелокального URL занимает много времени, и вы должны сделать это в фоновом потоке, поэтому пользовательский интерфейс не блокируется.

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

//------------------------------------------------------------------------------------------------------------------------------------------------- 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
//------------------------------------------------------------------------------------------------------------------------------------------------- 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 
    if (cell == nil) cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"]; 

    PFObject *group = groups[indexPath.row]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ // go to a background thread to load the image and not interfere with the UI 
     UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:group[PF_GROUP_LOGO]]]]; 
     dispatch_async(dispatch_get_main_queue(), ^{ // synchronize back to the main thread to update the UI with your loaded image 
      cell.imageView.image = image; 
     }); 
    }); 

    cell.detailTextLabel.text = [NSString stringWithFormat:@"%d users", (int) [group[PF_GROUP_MEMBERS] count]]; 
    cell.detailTextLabel.textColor = [UIColor lightGrayColor]; 

    return cell; 
} 

Я бы также рекомендовал использовать AFNetworking, так как author создал очень хорошую категорию в верхней части UIImageView, что позволяет загружать изображение с веб-URL в фоновом режиме автоматически. Опять же, в этом процессе много идей, и это всего лишь одна идея. Я бы порекомендовал прочитать this за полный учебник по этой теме.

Надеюсь, это полезно!

+1

спасибо! это работает почти отлично! Однако у меня есть еще один вопрос, почему, когда я прокручиваю нижнюю часть, прокручиваем назад вверх, а затем появляются определенные изображения? Как я могу это исправить? –

+1

Это проблема с кешированием, которая в целом представляет собой целый пакет червей. Опять же, AFNetworking - ваш друг :) – dokun1

+1

сладкий. еще раз спасибо! –

Смежные вопросы