解决iOS8下ALAssetsLibrary创建相册的bug

说到ALAssetsLibrary,相信搞iOS开发的大都知道它,在iOS上做过相册相关功能的应该对这个都比较熟悉了,用它来操作访问相册是很方便的。但是,,,,自从iOS8发布后,ALAssetsLibrary在Stack Overflow上被各种讨论了。因为在iOS8上用这个库创建相册会有个bug:创建相册,手动删除它,再用这个库去创建刚被删除的相册,这个时候方法回调是不会跑fail模块的,它走的是正常流程,但是带回来的group却是nil。

- (void)addAssetsGroupAlbumWithName:(NSString *)name resultBlock:(ALAssetsLibraryGroupResultBlock)resultBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock 

于是网上各种搜,也看到Stack Overflow各种各样的解决方法,反正我是没找到有效的解决办法。无意中在文档中看到了这个:

于是就顺着文档找下去,最后得出有效解决方法,废话不多说,直接贴代码了(到了下班点了)。

-(void)saveImageToXYAlbum:(UIImage*)image completion:(SaveImageCompletion)completion
{
    if(image){
        __weak ALAssetsLibrary *weakAssetsLibrary = assetsLibrary;
        __weak XYWallPaperHelper *weakSelf = self;
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            if(TT_IS_IOS8_AND_UP){
                PHPhotoLibrary* photoLibrary = [PHPhotoLibrary sharedPhotoLibrary];
                [photoLibrary performChanges:^{
                    PHFetchResult* fetchCollectionResult;
                    PHAssetCollectionChangeRequest* collectionRequest;
                    NSString *albumIdentifier = [weakSelf xyWallPaperAlbumIdentifier];
                    if(albumIdentifier){
                        fetchCollectionResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[albumIdentifier] options:nil];
                        PHAssetCollection* exisitingCollection = fetchCollectionResult.firstObject;
                        collectionRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:exisitingCollection];
                    }else{
                        fetchCollectionResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[XYWallPaperAlbum] options:nil];
                        // Create a new album
                        if ( !fetchCollectionResult || fetchCollectionResult.count==0 ){
                            collectionRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:XYWallPaperAlbum];
                            [weakSelf saveXYWallPaperAblumIdentifier:collectionRequest.placeholderForCreatedAssetCollection.localIdentifier];
                        }
                    }
                    PHAssetChangeRequest* createAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
                    [collectionRequest addAssets:@[createAssetRequest.placeholderForCreatedAsset]];

                } completionHandler:^(BOOL success, NSError *error){
                    completion(error);
                }];
            }else{
                [weakAssetsLibrary saveImage:image toAlbum:XYWallPaperAlbum withCompletionBlock:completion];
            }
        });
    }
}

这里有个地方需要注意,创建相册后要存储一下localIdentifier,因为下次再获取AssetCollection的时候需要用到它。如果每次都用相册名去试图获取到之前创建的同名AssetCollection,不会得到结果的。就这里需要注意一下,其他倒没什么,代码也比较简单。  上面代码部分针对iOS8以下版本的代码逻辑,这里就不赘述了,网上一大把。

时间: 2024-10-08 10:13:54

解决iOS8下ALAssetsLibrary创建相册的bug的相关文章

Nodejs express中创建ejs项目,解决express下默认创建jade,无法创建ejs问题

最近在看<Node.js开发指南>,看到使用nodejs进行web开发的时候,准备创建ejs项目遇到问题了, 书上命令为: ? 1 express -t ejs microblog 可是执行后,仍旧创建的是jade项目. 原来,express3.x,express4.x中创建ejs命令更新为: express -e microblog //即ejs,-j(即jade)  当然,最直接的,你也可以修改package.json里的定义来实现安装ejs. PS:建立工程过程 1.必须得安装expre

解决iOS8.0以上系统下无法通过代码创建被删除过的同名相册 ( iOS 8 Photos framework: Create a albums with iOS8 )

问题描述: 在苹果的 iOS8.0以上, 当你创建完一个相册, 例如名为"Rd", 然后在相册中手动删除了这个"Rd"相册, 再次通过代码 #import <AssetsLibrary/ALAssetsLibrary.h> ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; [assetsLibrary addAssetsGroupAlbumWithName:@"Rd

ios8使用ALAssetsLibrar创建单独文件夹方法以及删除文件夹闪退的bug

在ios8以下的系统创建新相册,然后在相册中手动删除了这个"琳小兮"相册,再使用下面的代码重新创建"琳小兮"相册是没有问题的:  [assetsLibrary addAssetsGroupAlbumWithName:@"琳小兮"                                                resultBlock:^(ALAssetsGroup *group)                  {         

解决vs2013下创建的python文件,到其他平台(如linux)下中文乱码(或运行时报SyntaxError: (unicode error) &#39;utf-8&#39; codec can&#39;t decode byte...)

Vs2013中创建python文件,在文件中没输入中文时,编码为utf-8的,如图 接着,在里面输入几行中文后,再次用notepad++查看其编码如下,在vs下运行也报错(用cmd运行就不会): 根据以有经验,这是字符编码的问题了,试着将python文件的转化为utf-8的,直接在notepad++上转utf-8 无bom编码格式的,保存,打开vs,会有以下提示 这里不要选择no吧,不然可能会提示以下类似的错误 如果有提示,直接关闭,不然的话,vs又会将此文件保存为ascii格式了 解决vs20

iOS 富文本格式字符 以及处理iOS8下textview设置富文本后输入bug

iOS的富文本设置,在iOS8下在textView的代理方法中设置textview的attributedText时,会出现富文本格式未加到text上的情况,可以在初始化时将文本属性赋给textview的typingAttributes.代码如下: NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.lineSpacing = 7;// 字体的行间距 UIF

ios8下添加高斯模糊、ios7创建快照

1. UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"IMG_0004"]]; imageView.frame = CGRectMake(0, 0,320, 720); [self.view addSubview:imageView]; //ios8下添加高斯模糊,模糊有3种类型 UIVisualEffectView *effectView = [[UIVisualEffe

Sql语句不能识别Go的解决办法(动态创建表的触发器)

问题来源 用sqlserver直接打开sql文本,执行没问题,但是当用Sqlcommand类执行cmdtext命令文本时总是失败报错. 原因分析及解决 用数据库直接执行sql语句没问题,甚至还可以用Go来进行分批处理,但是当你用链接类访问数据库,并执行sql语句时就有些限制,如下: System.Data.SqlClient.SqlCommand cmd; try { using (System.Data.SqlClient.SqlConnection newconn = new System.

rlwrap: command not found和解决linux下sqlplus 提供浏览历史命令行的功能

rlwrap工具可以解决linux下sqlplus 提供浏览历史命令行的功能,和删除先前输入错误的字母等问题 1.安装 需要readline包 这个安装光盘就有 [[email protected] RedHat]# cd RPMS/[[email protected] RPMS]# rpm -Uvh readline*warning: readline-4.3-13.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60eerror: Failed

td设置虚线dotted框,在chrome下有时会出现实线bug

chrome浏览器中,为td设置border:1px dotted #eee;时,有些地方会出现实线. 这是因为Chrome在border合并时,有点碰运气的感觉,两条虚线正好交错在一起时会合成一条实线.Demo中table的宽度是886px,增加1px或者减少1px都可以解决这个问题.有兴趣的童鞋还可以试着不断增加宽度,观察border交错时的变化,你会发现它6个像素为一个周期. 可参考 Chrome下的Border合并BUGhttp://ued.ctrip.com/blog/?p=2484