background image

iOS

       

中读取照片库

 

 

 

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]);