zoukankan      html  css  js  c++  java
  • 解决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 
    View Code


    于是网上各种搜,也看到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];
                }
            });
        }
    }
    View Code


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

    转载自:http://blog.csdn.net/jerrychenly/article/details/44858355

  • 相关阅读:
    Delphi 实现任务栏多窗口图标显示
    Win7如何部署定制的Quicklaunch图标
    Delphi中关于菜单的几个技巧
    delphi里为程序任务栏右键菜单添加自定义菜单
    DELPHI 让子窗体显示在任务栏上
    C# Newtonsoft.Json 读取文件,返回json字符串
    C# Newtonsoft.Json 读取文件,返回json字符串
    在使用layui Table时,死活显示不了数据,无效的 JSON 基元 解决办法
    newtonsoft返回json去掉字符串
    ASP.NET MVC AJAX 请求中加入 antiforgerytoken 解决“所需的防伪表单字段“__RequestVerificationToken”不存在”问题
  • 原文地址:https://www.cnblogs.com/luseike/p/4398364.html
Copyright © 2011-2022 走看看