2015-02-20 4 views
1

Данные моего изображения загружаются из основных данных в ячейку UITableView. Эти изображения автоматически масштабируются ОС (насколько мне известно) в cellForRowAtIndexPath:indexPath:. Неудивительно, что это вызывает много задержек при прокрутке таблицы.Производительность уменьшенных изображений UITableView

Аналогично, у меня есть UICollectionViewController, который загружает все те же изображения в виде коллекции, аналогичном приложению iOS Photos, и снова изображения масштабируются в cellForItemAtIndexPath:indexPath. Прокрутка является лагги, но она также принимает очень долгое время для загрузки VC.

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

Я сделал некоторые исследования и придумал пару возможных решений:

  1. Инициализировать «thumbnailArray» в viewDidLoad:animated:, масштабирование всех изображений, нужны перед тем как таблица/коллекция загружено , затем используйте этот новый массив в качестве источника данных для представлений. Я полагаю, что это решит проблему прокрутки, но не проблему загрузки коллекции.

  2. Создайте новые свойства для эскизных данных в моем классе обертки изображения. Эти данные будут созданы, когда объект обертки изображения будет создан (т. Е. Когда пользователь добавит изображение) и сохранен в основных данных. Я думаю, что это было бы предпочтительнее варианта №1.

Есть вариант два лучший путь, или есть лучшее решение, я не в курсе?

Вот мои cellForRowAtIndexPath:indexPath и cellForItemAtIndexPath:indexPath: методы:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    CMAEntryTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"entriesCell" forIndexPath:indexPath]; 

    CMAEntry *entry = [self.entries objectAtIndex:indexPath.item]; 

    cell.speciesLabel.text = [entry.fishSpecies name]; 
    cell.dateLabel.text = [self.dateFormatter stringFromDate:entry.date]; 

    if (entry.location) 
     cell.locationLabel.text = [entry locationAsString]; 
    else 
     cell.locationLabel.text = @"No Location"; 

    if ([entry.images count] > 0) 
     cell.thumbImage.image = [[entry.images objectAtIndex:0] dataAsUIImage]; 
    else 
     cell.thumbImage.image = [UIImage imageNamed:@"no_image.png"]; 

    if (indexPath.item % 2 == 0) 
     [cell setBackgroundColor:CELL_COLOR_DARK]; 
    else 
     [cell setBackgroundColor:CELL_COLOR_LIGHT]; 

    return cell; 
} 


- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"thumbnailCell" forIndexPath:indexPath]; 

    UIImageView *imageView = (UIImageView *)[cell viewWithTag:100]; 
    [imageView setImage:[[self.imagesArray objectAtIndex:indexPath.item] dataAsUIImage]]; 

    return cell; 
} 

Заранее спасибо!

Cohen

ответ

1

Спасибо за ваш вклад, ребята, но это решение, которое отлично поработало для меня. Единственное, что мне не нравится, это то, что теперь я храню экземпляр NSData полного изображения и два миниатюрных изображения с разными размерами в основных данных; однако это не кажется проблемой.

Что я сделал, это добавить пару атрибутов в мой подкласс NSManagedObject для хранения миниатюр. Данные эскиза инициализируются, когда изображение выбирается пользователем, а затем сохраняются в основных данных вместе с исходным изображением.

Затем я загружаю миниатюры в сборку асинхронно в контроллерах представления, в которых они мне нужны.

Отлично работает. Позволяет избавиться от всех проблем, которые я испытывал.

0

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

2 Также вы можете использовать функцию coredata batchsize для загрузки только необходимых данных.

3 Возможно, используя некоторый тип кэша в памяти для изображений могут помочь

+0

1. Но я не хочу, чтобы вид таблицы отображался с пустыми изображениями. Может быть, это не будет заметно? 2. Не автоматически ли это делают данные ядра? Загружает только свойства, если они используются? 3. Будет ли кэширование изображений ад, если они уже хранятся в основных данных в виде двоичных данных? Я не загружаю никаких изображений, данные просто хранятся в подклассе NSManagedObject. – cohenadair

0

В одном из моего проекта я столкнулся с таким же вопросом и я решил его с помощью AsyncImageView для загрузки thumbimage для моего Tableview cell.It будет загружать изображение асинхронно.

@property (nonatomic,strong)AsyncImageView * thumbImageView; 
    self.thumbImageView =[[AsyncImageView alloc] init]; 
cell.thumbImageView.imageURL =[NSURL fileURLWithPath:UrlString]; 
+0

Вы инициализируете thumbnailView в cellForRowAtIndexPath или в viewDidLoad? Прямо сейчас я даже не использую миниатюрные изображения, я просто использую тот, который выбрал пользователь. – cohenadair

+0

Да, я сделал это в cellForRowAtIndexPath. – AnshaD

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