UITableView 缩略图性能
UITableView thumbnail image performance
我的图像数据正在从核心数据加载到 UITableView 单元格中。这些图像由 cellForRowAtIndexPath:indexPath:
中的 OS(据我所知)自动缩放。毫不奇怪,这会在 table 视图中滚动时造成很大的延迟。
同样,我有一个 UICollectionViewController,它将所有相同的图像加载到类似于 iOS 照片应用程序的集合视图中,并且图像在 cellForItemAtIndexPath:indexPath
中缩放。滚动很慢,但加载 VC 也需要 非常 的时间。
在这种情况下优化性能的最佳方法是什么?
我做了一些研究并提出了一些可能的解决方案:
在viewDidLoad:animated:
中初始化一个"thumbnailArray",在加载table/collection视图之前缩放我需要的所有图像,然后使用这个新数组作为数据源的意见。我想这会解决滚动问题,但不会解决集合视图加载问题。
在我的图像包装器中为缩略图数据创建新属性 class。该数据将在创建图像包装器对象时创建(即当用户添加图像时)并保存在核心数据中。我认为这比选项 #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;
}
提前致谢!
科恩
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 子类添加几个属性来存储缩略图。缩略图数据在用户选择图像时初始化,然后与原始图像一起保存在核心数据中。
然后,我将缩略图异步加载到我需要的视图控制器中的集合中。
效果很好。摆脱我遇到的所有问题。
我的图像数据正在从核心数据加载到 UITableView 单元格中。这些图像由 cellForRowAtIndexPath:indexPath:
中的 OS(据我所知)自动缩放。毫不奇怪,这会在 table 视图中滚动时造成很大的延迟。
同样,我有一个 UICollectionViewController,它将所有相同的图像加载到类似于 iOS 照片应用程序的集合视图中,并且图像在 cellForItemAtIndexPath:indexPath
中缩放。滚动很慢,但加载 VC 也需要 非常 的时间。
在这种情况下优化性能的最佳方法是什么?
我做了一些研究并提出了一些可能的解决方案:
在
viewDidLoad:animated:
中初始化一个"thumbnailArray",在加载table/collection视图之前缩放我需要的所有图像,然后使用这个新数组作为数据源的意见。我想这会解决滚动问题,但不会解决集合视图加载问题。在我的图像包装器中为缩略图数据创建新属性 class。该数据将在创建图像包装器对象时创建(即当用户添加图像时)并保存在核心数据中。我认为这比选项 #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;
}
提前致谢!
科恩
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 子类添加几个属性来存储缩略图。缩略图数据在用户选择图像时初始化,然后与原始图像一起保存在核心数据中。
然后,我将缩略图异步加载到我需要的视图控制器中的集合中。
效果很好。摆脱我遇到的所有问题。