美文网首页iOS开发记录iOS开发iOS学习开发
谈谈iOS9之前调用系统相册的那些坑

谈谈iOS9之前调用系统相册的那些坑

作者: 无神 | 来源:发表于2015-10-22 12:19 被阅读5698次

    我们目前在做的项目,产品定位是“文化艺术领域的垂直社交微博”。说到艺术品,必然少不了图片的发布,所以相册的调用就成了必然的功能。正好这个模块分给了我来做,于是从网上查找调用系统相册的方法。附上代码,如下:

    /**
    *遍历相薄的,获取每个相片资源
    *
    *@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 ;
    

    这样遍历相册的速度和计算照片大小的问题都解决了!再次感谢大神!

    相关文章

      网友评论

        本文标题:谈谈iOS9之前调用系统相册的那些坑

        本文链接:https://www.haomeiwen.com/subject/htjthttx.html