UITableView 缩略图性能

UITableView thumbnail image performance

我的图像数据正在从核心数据加载到 UITableView 单元格中。这些图像由 cellForRowAtIndexPath:indexPath: 中的 OS(据我所知)自动缩放。毫不奇怪,这会在 table 视图中滚动时造成很大的延迟。

同样,我有一个 UICollectionViewController,它将所有相同的图像加载到类似于 iOS 照片应用程序的集合视图中,并且图像在 cellForItemAtIndexPath:indexPath 中缩放。滚动很慢,但加载 VC 也需要 非常 的时间。

在这种情况下优化性能的最佳方法是什么?

我做了一些研究并提出了一些可能的解决方案:

  1. viewDidLoad:animated:中初始化一个"thumbnailArray",在加载table/collection视图之前缩放我需要的所有图像,然后使用这个新数组作为数据源的意见。我想这会解决滚动问题,但不会解决集合视图加载问题。

  2. 在我的图像包装器中为缩略图数据创建新属性 class。该数据将在创建图像包装器对象时创建(即当用户添加图像时)并保存在核心数据中。我认为这比选项 #1 更可取。

选项二是最好的方法吗,还是有我不知道的更好的解决方案?

这是我的 cellForRowAtIndexPath:indexPathcellForItemAtIndexPath: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;
}

提前致谢!

科恩

1 我认为最好的方法是在后台线程中加载图像,以便快速加载 tableview。

2 您也可以使用 batchsize 的 coredata 特性来只加载必要的数据。

3 也许在内存中为图像使用某种类型的缓存可能会有所帮助

在我的一个项目中,我遇到了同样的问题,我通过使用 AsyncImageView 为我的 tableview 加载缩略图解决了这个问题 cell.It 将异步加载图像。

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

感谢您的意见,伙计们,但这是对我来说非常有效的解决方案。我唯一不喜欢的是现在我在核心数据中存储了完整图像的 NSData 实例和两个不同大小的缩略图;不过,这似乎不是问题。

我所做的是向我的 NSManagedObject 子类添加几个属性来存储缩略图。缩略图数据在用户选择图像时初始化,然后与原始图像一起保存在核心数据中。

然后,我将缩略图异步加载到我需要的视图控制器中的集合中。

效果很好。摆脱我遇到的所有问题。