2014-01-03 4 views
2

У меня есть UITableView, который будет содержать большое количество изображений.Как эффективно загружать изображения в UITableView?

В каждой ячейке будет 5 изображений, которые будут загружены случайно с сайта Parse.com.

Код запроса, прямо сейчас, находится в cellForRowAtIndexPath.

Это вызывает несколько вопросов:

1.) Там некоторое отставание/задержки при прокрутке таблицы.

2.) Изображения, теперь по какой-то нечетной причине, не отображаются в нужном месте.

3.) Изображения перезагружаются/меняются каждый раз, когда прокручивается таблица.

Я хотел бы, чтобы изображения были загружены только один раз, когда на этом UIView, в нужном месте и с плавной прокруткой.

Каков наилучший способ справиться с этим?

Вот код, как я загрузки изображения:

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

    // set up the cell here 

    // query and display random images from parse.com 
    PFQuery * query = [PFUser query]; 
    [query whereKey:@"category" equalTo:self.cell.label.text]; 
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 

     if (error) 
     { 
      NSLog(@"Error: %@ %@", error, [error userInfo]); 
     } 
     else 
     { 
      for (int i = 0; i < objects.count; i++) 
      { 
       self.profilePicObject = [objects objectAtIndex:i]; 

       int imgRandom = arc4random() % [objects count]; 

       self.randomProfilePicObject = [objects objectAtIndex:imgRandom]; 

       self.imageFile = [self.randomProfilePicObject objectForKey:@"imageFile"]; 
       NSURL * imageFileURL = [[NSURL alloc] initWithString:self.imageFile.url]; 
       NSData * imageData = [NSData dataWithContentsOfURL:imageFileURL]; 
       UIImage * aImage = [[UIImage alloc] initWithData:imageData]; 

       self.cell.profilePicOne.image = aImage; 
      } 
    } 

    return self.cell; 

} 

EDIT:

Я использую SDWebImage и теперь таблица прокручивается плавно и изображения отображения.

Новый номер:

Изображения загружаются в неправильных клеток.

Я запрашиваю таблицу и сопоставляю текст ярлыка с соответствующей строкой в ​​таблице Parse и использую ее для отображения правильного изображения.

Первоначально некоторые изображения загружаются в правильную ячейку, а некоторые нет.

Когда я прокручиваю, изображения появляются повсюду.

Каков наилучший способ исправить это?

Вот как я устанавливаю вверх клетки:

static NSString * cellIdentifier = @"FilterSelectCell"; 

self.cell = (FilterSelectCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

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

     self.cell.profilePicOne.clipsToBounds = YES; 
     self.cell.profilePicOne.layer.cornerRadius = 20.0; 

     self.cell.profilePicTwo.clipsToBounds = YES; 
     self.cell.profilePicTwo.layer.cornerRadius = 20.0; 

     self.cell.profilePicThree.clipsToBounds = YES; 
     self.cell.profilePicThree.layer.cornerRadius = 20.0; 

     self.cell.profilePicFour.clipsToBounds = YES; 
     self.cell.profilePicFour.layer.cornerRadius = 20.0; 

     self.cell.profilePicFive.clipsToBounds = YES; 
     self.cell.profilePicFive.layer.cornerRadius = 20.0; 
    } 

    self.cell.label.text = [self.myArray objectAtIndex:indexPath.row]; 
+0

Вы можете предварительно загрузить некоторые случайные изображения, однако многие из которых, по вашему мнению, понадобятся в -viewDidLoad. Почему отложить это до тех пор, пока они не понадобятся? Кроме того, вы можете (и в значительной степени) загружать изображения в фоновом режиме, используя что-то вроде NSURLConnection или SDWebImage. – Josh

ответ

1

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

[self.cell.profilePicOne setImageWithURL:imageFileURL placeholderImage:[UIImage imageNamed:@"LOADING_IMAGE.png"]]; 

SDWebImage Repository

+0

Получение этой ошибки: завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: '- [UIImageView setImageWithURL: placeholderImage:]: непризнанный селектор, отправленный экземпляру –

+0

Вы импортировали фреймворк SDWebImage, который я связал с вашим проектом? В нижней части ссылки есть инструкции по установке. Если это так, добавьте эту строку вверху файла, который вы пытаетесь использовать в: #import «SDWebImage/UIImageView + WebCache.h» –

+0

Да. Когда я добавляю -ObjC, это вызывает еще больше проблем. –

0

Использование асинхронного изображения загрузчик с поддержкой кэша с UIImageView category.I использовали это в течение длительного времени.Черт, конечно, проблема с урмом может быть преодолена этим SDWebImage

0

Вы можете проверить эту технику APSmartStorage. Он поддерживает загрузку, память и кеш диска.

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