iOS 批量下載網絡圖片到本地自定義(or系統)相冊

廢話不說,直接上代碼吧

.h 文件
#import <Foundation/Foundation.h>

@interface SaveImageToPHAsset : NSObject
/**保存圖片到自定義相冊*/
- (void)saveImages:(NSArray *)imageArrs;
@end

.m文件
#import "SaveImageToPHAsset.h"
#import <Photos/Photos.h>
@interface SaveImageToPHAsset()
@property (nonatomic, strong) NSMutableArray *listOfDownLoadImageArr;
@end
@implementation SaveImageToPHAsset
- (NSMutableArray *)listOfDownLoadImageArr {
    if (!_listOfDownLoadImageArr) {
        _listOfDownLoadImageArr = [NSMutableArray array];
    }
    return _listOfDownLoadImageArr;
}
- (void)saveImages:(NSArray *)imageArrs {
    
    for (int i = 0; i <imageArrs.count; i++) {
        NSData *data = [NSData dataWithContentsOfURL:[NSURL  URLWithString:imageArrs[i]]];
        UIImage *image = [UIImage imageWithData:data]; // 取得圖片
        [self.listOfDownLoadImageArr addObject:image];
    }

    
    PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
    
    // 2.判斷用戶的授權狀態
    
    if (status == PHAuthorizationStatusNotDetermined) {
        
        // 如果狀態是不確定的話,block中的內容會等到授權完成再調用
        [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
            
            // 授權完成就會調用
            
            if (status == PHAuthorizationStatusAuthorized) {
        //調用存儲圖片的方法
        [self CWWSavePhotos];
            }
        }];
        //如果允許訪問
    } else if (status == PHAuthorizationStatusAuthorized) {
        //調用存儲圖片的方法
    
        [self CWWSavePhotos];
        
        //如果權限是拒絕
    } else {
        // 使用第三方框架,彈出一個頁面提示用戶去打開授權
        
         [MBProgressHUD showText:@"進入設置打開允許訪問相冊開關" toView:nil];
    }
}
- (void)CWWSavePhotos {
    if (self.listOfDownLoadImageArr.count > 0) {
        UIImage *image = [self.listOfDownLoadImageArr objectAtIndex:0];
        [self savePhoto:image];
    }
    else {
        
    }

}
#pragma mark - 該方法獲取在圖庫中是否已經創建該App的相冊
//該方法的作用,獲取系統中所有的相冊,進行遍歷,若是已有相冊,返回該相冊,若是沒有返回nil,參數為需要創建  的相冊名稱
- (PHAssetCollection *)fetchAssetColletion:(NSString *)albumTitle

{
    // 獲取所有的相冊
    PHFetchResult *result = [PHAssetCollection           fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
    
    //遍歷相冊數組,是否已創建該相冊
    
    for (PHAssetCollection *assetCollection in result) {
        
        if ([assetCollection.localizedTitle isEqualToString:albumTitle]) {
            
            return assetCollection;
            
        }
        
    }
    
    return nil;
    
}
#pragma mark - 保存圖片的方法

- (void)savePhoto:(UIImage *)imagePhoto

{
    //修改系統相冊用PHPhotoLibrary單粒,調用performChanges,否則蘋果會報錯,并提醒你使用
    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        // 調用判斷是否已有該名稱相冊
        NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
        //以項目名字命名相冊
        NSString *app_Name = [infoDictionary objectForKey:@"CFBundleDisplayName"];
        PHAssetCollection *assetCollection = [self fetchAssetColletion:app_Name];
        //創建一個操作圖庫的對象
        
        PHAssetCollectionChangeRequest *assetCollectionChangeRequest;
        if (assetCollection) {
            // 已有相冊
            assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
            
        } else {
            // 1.創建自定義相冊
            assetCollectionChangeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:app_Name];
        }
        // 2.保存你需要保存的圖片到系統相冊(這里保存的是_imageView上的圖片)
        PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:imagePhoto];
        // 3.把創建好圖片添加到自己相冊(ps:想保存到系統相冊,就注釋掉下邊一行代碼就ok)
        //這里使用了占位圖片,為什么使用占位圖片呢
        //這個block是異步執行的,使用占位圖片先為圖片分配一個內存,等到有圖片的時候,再對內存進行賦值
        PHObjectPlaceholder *placeholder = [assetChangeRequest placeholderForCreatedAsset];
        [assetCollectionChangeRequest addAssets:@[placeholder]];
    } completionHandler:^(BOOL success, NSError * _Nullable error) {
        //彈出一個界面提醒用戶是否保存成功
        if (error) {
            //[SVProgressHUD showErrorWithStatus:@"保存失敗"];
        } else {
            // [SVProgressHUD showSuccessWithStatus:@"保存成功"];
            [self.listOfDownLoadImageArr removeObjectAtIndex:0];
        }
        [self CWWSavePhotos];

    }];
    
}
@end

調用的方法,直接引用頭文件,傳一個imageURL數組就可以了
[[SaveImageToPHAsset alloc] saveImages:_model.images];//保存圖片到相冊

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.自定義控件 a.繼承某個控件 b.重寫initWithFrame方法可以設置一些它的屬性 c.在layouts...
    圍繞的城閱讀 3,444評論 2 4
  • iOS網絡架構討論梳理整理中。。。 其實如果沒有APIManager這一層是沒法使用delegate的,畢竟多個單...
    yhtang閱讀 5,237評論 1 23
  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,757評論 0 9
  • 1.OC里用到集合類是什么? 基本類型為:NSArray,NSSet以及NSDictionary 可變類型為:NS...
    輕皺眉頭淺憂思閱讀 1,393評論 0 3
  • 花了將近三天的時間看完的這兩本書,它分上下冊。這三天的時間我整個人的狀態都不好,整個人好像蒼老了不只十歲。...
    木北川閱讀 423評論 0 1