Photos框架保存图片到本地相册及自定义相册中

/*

 一、 Photos框架:主要操作--------增删查改

 1.PHAsset: 一个PHAsset对象就代表着一个图片或者视频

 1> 查:[PHAsset fetchAssets...]

 2> 增删改: PHAssetChangeRequest  (所有跟图片/视频相关的改动)

 2.PHAssetCollection:一个PHAssetCollection对象代表一个相册

 1> 查: [PHAssetCollection fetchAsset...]

 2> 增删改: PHAssetCollectionChangeRequest   (所有跟相册相关的改动)

 二、须知

 1.对相册还是图片、视频的任何【增删改】操作,都必须在performChanges或者 performChangesAndWait的block里执行,不然会报错,

例如:

'This method can only be called from inside of -[PHPhotoLibrary performChanges:completionHandler:] or -[PHPhotoLibrary performChangesAndWait:error:]'

三、具体的保存步骤如下

 // 1.保存到相册【相机胶卷】

    __block NSString *assetID = nil;

    NSError *error = nil;

    [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{

        assetID = [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset.localIdentifier;

    } error:&error];

    if (error) return nil;

    // 2.获取刚才保存的相片

    PHFetchResult<PHAsset *> *createAssets = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetID] options:nil];

   

   //3.获取相册

    PHFetchResult<PHAssetCollection *> *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];

    // 相册的名字,一般都是获取软件的名字

    NSString *title = [NSBundle mainBundle].infoDictionary[(__bridge NSString *)kCFBundleNameKey];

    

    // 查找当前app对应的相册

   __block PHAssetCollection *createdCollection = nil;

    for (PHAssetCollection *collection in collections) {

        //当前app对应的相册已经存在

        if([collection.localizedTitle isEqualToString:title]){

           createdCollection = collection;

        }

    }

    // 当前app对应的相册不存在,创建一个相册

    // 同步执行修改操作

    NSError *error = nil;

    __block NSString *ID = nil;

    [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{

        // 创建相册的唯一标识

        ID = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title].placeholderForCreatedAssetCollection.localIdentifier;

    } error:&error];

    if (error) return nil;

    // 根据唯一标识抓取到相册

    createdCollection = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[ID] options:nil].lastObject;

// 4.保存图片到自定义相册

    [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{

        PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createdCollection];

        //最后添加的图片放在最前面

        [request insertAssets:createAssets atIndexes:[NSIndexSet indexSetWithIndex:0]];

    } error:&error];

    

原文地址:https://www.cnblogs.com/MJP334414/p/6141698.html