我们目前在做的项目,产品定位是“文化艺术领域的垂直社交微博”。说到艺术品,必然少不了图片的发布,所以相册的调用就成了必然的功能。正好这个模块分给了我来做,于是从网上查找调用系统相册的方法。附上代码,如下:
/**
*遍历相薄的,获取每个相片资源
*
*@return遍历相薄的block(groupEnumerBlock)
*/
- (ALAssetsGroupEnumerationResultsBlock)getGroupEnumerBlock{
ALAssetsGroupEnumerationResultsBlock groupEnumerBlock = ^(ALAsset *result,NSUInteger index,BOOL *stop){
if(result != NULL) {
if([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) {
//把相片对象加到数组中去
//生成照片model
BKAssetModel *itemModel = [[BKAssetModel alloc] init];
itemModel.asset = result ;
itemModel.fileSize = 0.0;//fileMB ;
itemModel.isSelected = NO;
itemModel.isFromCamera=NO;
//逆序插入,保证最新的相片显示在最前面
[self.photoDataArrinsertObject:itemModelatIndex:0];
}
}
};
return groupEnumerBlock ;
}
//获取根据分组类型获取到相应的相片
- (void)getPhotsWithGroupType:(ALAssetsGroupType)groupType{
@autoreleasepool{
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror){
BKLog(@"相册访问失败=%@", [myerror localizedDescription]);
if([myerror.localizedDescription rangeOfString:@"Global denied access"].location!=NSNotFound) {
BKLog(@"无法访问相册.请在'设置->定位服务'设置为打开状态.");
//[MBProgressHUD showWarning:@"请到设置->定位服务,设置为打开!" toView:self.view];
}else{
BKLog(@"相册访问失败.");
//[MBProgressHUD showWarning:@"请到设置->隐私->相机->开启「宝库」权限!" toView:self.view];
}
};
ALAssetsLibraryGroupsEnumerationResultsBlock libraryGroupsEnumeration ;
libraryGroupsEnumeration = ^(ALAssetsGroup* group,BOOL* stop){
if(group ==nil)
{
[self.albumCollectionView reloadData];//分组遍历完成,加载数据
}
if(group !=nil) {
[self.assetsGroup insertObject:groupatIndex:0];//把照片分组加入到数组中
[group enumerateAssetsUsingBlock:
[self getGroupEnumerBlock]];
}
};
[self.assetLibrary enumerateGroupsWithTypes:groupType
usingBlock:libraryGroupsEnumeration
failureBlock:failureblock];
}
}
希望能够对需要调用系统相册的同行有所帮助,以上代码是本人修改过的,且已经填了那个坑。
这个坑就是遍历相册生成对应model的时计算了照片的大小。这个时候是不能够计算照片的大小,我刚开始写的时候,生成model的同时把照片的大小也计算了,结果可想而知,相册遍历的时候特别忙,如果相册里照片很多,那就相当于是死机啦!!!好惨啊,于是用各种多线程去解决,尝试了半天,无果!于是求助一哥们,大神看了一会儿,说了一句“你把计算照片大小的那行代码去掉试试!”。果然遍历的速度正常啦,相册秒出!我问他“你怎么看出来的?”,他说“就看着那行代码比较奇怪”!我靠,大神就是牛逼!!!于是生成model 的时候就不计算照片的大小了(itemModel.fileSize=0.0;//fileMB ;
),直接赋值0.0.等到选择照片的时候才计算照片的大小,代码如下:
//计算文件大小
#define PER_MB_BYTES (1024.0*1024.0)//1兆提示:1KB = 1024 B, 1MB = 1024 KB
ALAssetRepresentation *representation = [assetModel.asset defaultRepresentation];
CGFloat fileMB = (CGFloat)([representationsize]/PER_MB_BYTES);
assetModel.fileSize= fileMB ;
这样遍历相册的速度和计算照片大小的问题都解决了!再次感谢大神!
网友评论