解决iOS8下ALAssetsLibrary创建相册的bug
2015-04-03 18:40
495 查看
说到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以下版本的代码逻辑,这里就不赘述了,网上一大把。
- (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以下版本的代码逻辑,这里就不赘述了,网上一大把。
相关文章推荐
- 解决iOS8下ALAssetsLibrary创建相册的bug
- 解决IOS8上无法创建同名删除相册的问题
- 解决iOS8.0以上系统下无法通过代码创建被删除过的同名相册 ( iOS 8 Photos framework: Create a albums with iOS8 )
- 解决iOS8.0以上系统下无法通过代码创建被删除过的同名相册 ( iOS 8 Photos framework: Create a albums with iOS8 )
- ALAssetsLibrary-代码操作iOS相册资源
- Win7中无法创建文件‘新建 库.library-ms’文件系统错误(16389)”如何解决
- ALAssetsLibrary读取相册里面的图片
- vs2008 创建ATL服务程序bug解决方法
- (原) ALAssetsLibrary遍历相册及略所图
- iOS相册访问 ALAssetsLibrary(获取到相册的图片)+ 图片格式
- ALAssetsLibrary-代码操作iOS相册资源
- ALAssetsLibrary---保存照片到指定相册
- 关于解决CommunityServer使用中文名字注册自动创建博客和相册的问题
- easyui 1.4.3 窗口创建或拖动超过父元素 边界 BUG 解决方法
- ios8中,相册创建后手动删除,不能再进行创建显示
- 临时解决UIImagePickerController在可编辑模式下选择相册图片后不能上移的bug
- 临时解决UIImagePickerController在可编辑模式下选择相册图片后不能上移的bug
- IE下动态创建Input出现bug的解决方法
- ALAssetsLibrary获取相册列表