Данные моего изображения загружаются из основных данных в ячейку UITableView. Эти изображения автоматически масштабируются ОС (насколько мне известно) в cellForRowAtIndexPath:indexPath:
. Неудивительно, что это вызывает много задержек при прокрутке таблицы.Производительность уменьшенных изображений UITableView
Аналогично, у меня есть UICollectionViewController, который загружает все те же изображения в виде коллекции, аналогичном приложению iOS Photos, и снова изображения масштабируются в cellForItemAtIndexPath:indexPath
. Прокрутка является лагги, но она также принимает очень долгое время для загрузки VC.
Каков наилучший способ оптимизации производительности в этом сценарии?
Я сделал некоторые исследования и придумал пару возможных решений:
Инициализировать «thumbnailArray» в
viewDidLoad:animated:
, масштабирование всех изображений, нужны перед тем как таблица/коллекция загружено , затем используйте этот новый массив в качестве источника данных для представлений. Я полагаю, что это решит проблему прокрутки, но не проблему загрузки коллекции.Создайте новые свойства для эскизных данных в моем классе обертки изображения. Эти данные будут созданы, когда объект обертки изображения будет создан (т. Е. Когда пользователь добавит изображение) и сохранен в основных данных. Я думаю, что это было бы предпочтительнее варианта №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. Но я не хочу, чтобы вид таблицы отображался с пустыми изображениями. Может быть, это не будет заметно? 2. Не автоматически ли это делают данные ядра? Загружает только свойства, если они используются? 3. Будет ли кэширование изображений ад, если они уже хранятся в основных данных в виде двоичных данных? Я не загружаю никаких изображений, данные просто хранятся в подклассе NSManagedObject. – cohenadair