解決iOS8下ALAssetsLibrary建立相簿的bug,alassetslibrary
說到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以下版本的代碼邏輯,這裡就不贅述了,網上一大把。