PHAssetCollection我习惯称之为相册,在上一节主要总结和学习了对PHAsset的使用,有了上一节的基础,这一节并不难。
对PHAsset的操作主要涉及的类是PHAssetChangeRequest和它的子类PHAssetCreationRequest。同样的,对于相册的操作也有一个专门的类:PHAssetCollectionChangeRequest。
不过虽然说是创建相册,但是其实你并没有权限直接向创建的相册添加或者更新新的原本在相册中不存在的资源,而只是把原来的相册中的资源做了重新归纳和调整而已,如果想添加不存在的资源,还是得用PHAssetChangeRequest。
记得在之前曾经探讨过,发现所有的各种类型的相册中,都允许被永久删除单一asset,除此之外,系统自带的和同步过来的相册都不用许做其他的操作,只有自己创建的相册才被允许在相册层面对资源做增删改的操作。
PHAssetCollectionChangeRequest
和PHAssetChangeRequest一样,相关的操作都需要放到PHPhotoLibrary的perform的block中。
- 创建相册
- (IBAction)toCreateAssetCollection:(id)sender {
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetCollectionChangeRequest * request = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:@"相册"];
NSLog(@"identifier:%@", request.placeholderForCreatedAssetCollection.localIdentifier); //获取创建的相册的永久的唯一identifier
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (success) {
[self showDetailInfo:@"创建成功"];
} else {
[self showDetailInfo:@"创建失败"];
}
}];
}
如上,直接调用方法creationRequestForAssetCollectionWithTitle
即可创建相册,同时,可以通过placeholderForCreatedAssetCollection可以获取到创建的相册的identifier。
这里需要指出的是创建的相册名字是可以重复的。
- 删除相册
主要的方法是+ (void)deleteAssetCollections:(id
;所以首先要获取到要删除的相册,但是需要明确的一点是,必须判断是否有权限去删除该相册。这里的assetCollections是asset collection的集合,但是该集合需要遵守协议NSFastEnumeration。)assetCollections;
- (IBAction)toDeleteAssetCollection:(id)sender {
// 先获取需要删除的相册,其实能删除的也就只有自己创建的相册而已
NSMutableArray * delArr = [NSMutableArray array];
PHFetchResult * result = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil];
[result enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj canPerformEditOperation:PHCollectionEditOperationDelete]) { // 判断是否有权限删除
[delArr addObject:obj];
}
}];
if (delArr.count == 0) {
[self showDetailInfo:@"No thing to delete!"];
return;
}
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
[PHAssetCollectionChangeRequest deleteAssetCollections:delArr];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (success) {
[self showDetailInfo:@"删除成功"];
} else {
[self showDetailInfo:@"删除失败"];
}
}];
}
- 更新相册
更新相册有两种方法:
+ (nullable instancetype)changeRequestForAssetCollection:(PHAssetCollection *)assetCollection;
+ (nullable instancetype)changeRequestForAssetCollection:(PHAssetCollection *)assetCollection assets:(PHFetchResult *)assets;
实例如下:
- (IBAction)toModifyAssetCollectionWithoutIndexes:(id)sender {
// 测试其他相册是否可以从其他相册添加内容,这里测试SmartAlbum,你会发现下面打印了一系列的不能添加
PHFetchResult * smartCollection = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:nil];
[smartCollection enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj canPerformEditOperation:PHCollectionEditOperationAddContent]) {
NSLog(@"可以添加");
} else {
NSLog(@"不能添加");
}
}];
PHFetchResult * result = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
if (result.count == 0) {
[self showDetailInfo:@"没有可以修改的相册"];
return;
}
// 添加
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
// 获取assets
PHFetchResult * fetchCollection = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil];
PHFetchResult * fetchAssets = [PHAsset fetchAssetsInAssetCollection:fetchCollection.firstObject options:nil];
PHAssetCollectionChangeRequest * request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:result.firstObject];
[request addAssets:fetchAssets];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (success) {
[self showDetailInfo:@"修改成功"];
} else {
[self showDetailInfo:@"修改失败"];
}
}];
}
- (IBAction)toModifyAssetCollectionWithIndexes:(id)sender {
PHFetchResult * result = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
if (result.count == 0) {
[self showDetailInfo:@"没有可以修改的相册"];
return;
}
// 添加
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
// 获取assets
PHFetchResult * fetchCollection = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumFavorites options:nil];
PHFetchResult * fetchAssets = [PHAsset fetchAssetsInAssetCollection:fetchCollection.firstObject options:nil];
// asset必须为当前collection里的,如果没有调用changeRequestForAssetCollection方法,都可以
PHAssetCollectionChangeRequest * request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:result.firstObject assets:[PHAsset fetchAssetsInAssetCollection:result.firstObject options:nil]];
NSMutableIndexSet * mutableIndexSet = [NSMutableIndexSet indexSet];
for (NSInteger i = 1; i <= fetchAssets.count; i++) {
[mutableIndexSet addIndex:i];
}
// 这里的index表示在相册中的位置;要保证indexes的长度为assets的长度;indexes里的值不能超过合并后的相册的个数
[request insertAssets:fetchAssets atIndexes:mutableIndexSet];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (success) {
[self showDetailInfo:@"修改成功"];
} else {
[self showDetailInfo:@"修改失败"];
}
}];
}
这里着重记录一下带assets的更新,苹果文档里说,如果使用index,则应该使用该方法,但是我实验发现,即使这里不使用带assets的方法也可以正常操作。
另外这里的参数indexes,首先要保证其中包含的个数和要操作的asset相同;其次里面的值不允许越界,即里面出现的值不能超出要修改的相册里的资源的总数,否则程序会崩溃。
最后,indexes里的值表示对应assets的位置。
还有其他的几个更新相册的方法,可以自己去实验,大都和这里差不多。
至此,相册的增删改查也告一段落!