iOS 中如果我们只有一次读取一张图片或者一个视频(或拍一张照片/视频)的需求,那么
我们用
UIImagePickerController 就可以搞定。但是很多时候我们需要一次性从 PhotoLibrary
读取多个照片或者视频,这时候我们就需要另辟蹊径了,好在
apple 为我们提供了相应的
接口。
在开始
coding 之前我们想要认识几个类:
ALAssetsLibrary:代表整个 PhotoLibrary,我们可以生成一个它的实例对象,这个实例对象
就相当于是照片库的句柄。
ALAssetsGroup:照片库的分组,我们可以通过 ALAssetsLibrary 的实例获取所有的分组的
句柄。
ALAsset:一个 ALAsset 的实例代表一个资产,也就是一个 photo 或者 video,我们可以通
过他的实例获取对应的
subnail 或者原图等等。
还需要了解的一个东东就是
blocks,apple 在 iOS 4.0 以后大量出现了这玩意儿,有使用越
来越广的意思,不过这玩意儿确实好用。关于这玩意儿的内容我在这里不多讲,关注我的博
客我会细讲。
对于本文的需求,我们读取
group 和每个 asset 都是异步的,但是我们现在用 blocks 我们可
以在一个函数里面搞定。所以
blocks 确实很方便。
下面直接看代码吧
:
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc]init];//生成整个 photolibrary 句柄的
实例
NSMutableArray *mediaArray = [[NSMutableArray alloc]init];//存放 media 的数组
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup
*group, BOOL *stop) {//获取所有 group
[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {//
从
group 里面
NSString* assetType = [result valueForProperty:ALAssetPropertyType];
if ([assetType isEqualToString:ALAssetTypePhoto]) {
NSLog(@"Photo");
}else if([assetType isEqualToString:ALAssetTypeVideo]){
NSLog(@"Video");
}else if([assetType isEqualToString:ALAssetTypeUnknown]){
NSLog(@"Unknow AssetType");
}
NSDictionary *assetUrls = [result valueForProperty:ALAssetPropertyURLs];
NSUInteger assetCounter = 0;
for (NSString *assetURLKey in assetUrls) {
NSLog(@"Asset URL %lu = %@",(unsigned long)assetCounter,[assetUrls
objectForKey:assetURLKey]);