转:http://blog.csdn.net/icetime17/article/details/49745055
PhotoKit是苹果推出的用于替代ALAssetsLibrary的框架。
PhotoKit为使用照片和视频资源提供了新的API,包括由Photos app管理的iCloud Photos资产,所以你可以在“Camera roll”中直接编辑照片,无需提前导入。PhotoKit还包含一个线程安全架构用以获取、缓存缩略图和全尺寸图片,请求资产更改,遵守其他应用所做的变化,以及对资产内容进行可恢复的编辑。
正因为苹果已经做了大量的封装工作,使得开发者在使用PhotoKit的时候非常方便。在这里,将对比之前的一篇ALAssetsLibrary学习记录来简单介绍PhotoKit的基本使用。先简单回顾下ALAssetsLibrary:
ALAssetsLibrary 提供了访问iOS设备下照片应用下所有照片和视频的接口.从 ALAssetsLibrary 中可读取所有的相册数据,即 ALAssetsGroup 对象列表; 从每个 ALAssetsGroup 中可获取到其中包含的照片或视频列表,即 ALAsset 对象列表. 其层次关系为
ALAssetsLibrary -> ALAssetsGroup -> ALAsset -> ALAssetRepresentation.
每个 ALAsset 可能有多个representations表示, 即ALAssetRepresentation 对象:
使用其defaultRepresentation 方法可获得其默认representations,
使用[asset valueForProperty: ALAssetPropertyRepresentations ]可获取其所有representations的 UTI 数组。
从ALAsset对象可获取缩略图 thumbnail 或 aspectRatioThumbnail ;
需要注意的是:
通过ALAssetsLibrary对象获取的其他对象只在该ALAssetsLibrary对象生命期内有效, 即若该ALAssetsLibrary对象被销毁, 则其他从中获取的对象都不能再访问了. 因此, 采用以上block的方式会比较方便.
对于ALAssetsLibrary对象,通常采用单例模式。
所有得到的都为CGImageRef对象.
推荐使用fullScreenImage, 因其已调整过. 而fullResolutionImage尺寸太大, 需要自己调整和缩放.
PhotoKit使用PHAssetCollection存储相册,使用PHAsset存储每个图片资源,使用PHImageManager从asset中请求图片,即关键点在于PHAssetCollection -> PHAsset -> PHImageManager,分别对应方法:
fetchAssetCollectionsWithType, fetchAssetsInAssetCollection, requestImageForAsset。而关于该图片资源的信息都可以从PHAsset中获取,如pixelWidth, creationDate, location, favorite等。
PHAssetCollection表示一个相册或一个时刻,是PHCollection的子类。
PHCollectionList表示一组PHCollection,本身也是一个PHCollection。
PHAsset表示一个资源,跟ALAsset对应,一个PHAsset可同时属于多个不同的PHAssetCollection。
PHFetchResult表示所请求资源的数组,可包含PHAssetCollection,也可包含PHAsset。使用PHFetchOption定义请求资源时的参数。
PHImageManager通过请求的方式获取图片及其参数。其中requestImageForAsset有多个参数需注意,这里就不详细介绍了。
代码如下:
- (void)loadPhotos {// 所有智能相册PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];for(NSIntegeri=0; i
- (void)loadPhotos {// 所有智能相册PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];for(NSIntegeri=0; i
PHAssetCollection *assetCollection = (PHAssetCollection *)collection;// 从一个相册中获取的PHFetchResult中包含的才是PHAssetPHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
PHAsset *asset =nil;if(fetchResult.count!=0) {
asset = fetchResult[0];
}// 使用PHImageManager从PHAsset中请求图片PHImageManager *imageManager = [[PHImageManager alloc] init];
[imageManager requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFill options:nilresultHandler:^(UIImage* _Nullable result,NSDictionary* _Nullable info) {if(result) {NSLog(@"%@", result);
}
}];
}else{
NSAssert1(NO, @"Fetch collection not PHCollection: %@", collection);
}
}
}
其中,PHFetchResult是一个数组,可用于存放PHAssetCollection,也可用于存放PHAsset,这一点对于初学者不易理解。
PhotoKit相对于ALAssetsLibrary的改进在于:
1. ALAssetsLibrary获取数据,无论相册还是资源都是枚举方式(ALAssetLibrary照片库->ALAssetGroup相册->ALAsset资源)遍历照片库取得相应的数据。而PhotoKit通过传入参数直接获取相应的数据,效率提升不少且灵活,统一用PHFetchResult封装。
2. 在ALAssetsLibrary中,相册和资源是对应不同的对象(ALAssetGroup和ALAsset),因此获取接口没有关联。而PhotoKit中有PHFetchResult这个可以统一储存相册或资源的对象,因此更方便。
3. PhotoKit返回资源结果时,同时返回了资源的元数据,获取元数据在AssetsLibrary中很难办到。通过PHAsset,可以直接获取资源是否被收藏(favorite)和隐藏(hidden),拍摄图片时是否开启了HDR或全景模式,甚至能通过一张连拍图片获取到连拍图片中的其他图片。即PhotoKit能更好与设备照片库接入。
PhotoKit的基本使用就介绍到这里,一些高级的用法留待以后进一步挖掘。