有关PhotoKit的基础知识,参考我的另一篇博文: 优雅的创建一个相册管理类。
这篇文章记录一下在实际项目中,自定义相册的优化工作。
之前的文章提到过,获取照片高清原图使用下面的方法:
PHImageManager *manger = [PHImageManager defaultManager];
PHImageRequestOptions * options = [[PHImageRequestOptions alloc] init];
options.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat;
options.synchronous = YES;
options.resizeMode = PHImageRequestOptionsResizeModeFast;
options.networkAccessAllowed = NO;
[manger requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
//获取照片 result
}];
在实际的使用过程中,如果涉及多张照片循环获取原图,就会出现内存大幅度上升的问题。通过Allcation就行内存检测的时候,发现正是该方法会占用很大的内存。
经过查找资料和自己的验证后,发现可以通过下面的方法获取图片。这样内存会稳定,就不会引起这样内存的问题。
[manger requestImageDataForAsset:asset options:options resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
UIImage *image = [UIImage imageWithData:imageData];
//获取照片 image
}];
该方法是获取先图片的二进制流,然后转化为UImage。
另外,对于滑动相册的时候,内存也会出现一定的增大,虽然不会造成明显的卡顿现象。
但官方也给出了PhotoKit的缓存机制接口,更好的优化内存,提升滑动的流畅性。
具体方法如下:
在当前拥有UICollectionView的视图控制器中:
@property (nonatomic, assign) CGRect previousPreheatRect;
@property (nonatomic, strong) PHCachingImageManager *imageManager;
- (PHCachingImageManager *)imageManager
{
if (_imageManager == nil) {
_imageManager = [PHCachingImageManager new];
}
return<