我们之前有个需求是 需求直接在界面显示相册的照片 如果大家有需求 可以自取

导入 <Photos/Photos.h>

@property (nonatomic,strong) NSArray <PHFetchResult *>*fetchResults;
@property (nonatomic, strong) NSArray <PHAssetCollection *>*albums;
@property (nonatomic, strong) UIImageView *showImageView;
获取相册权限 如果有权限 直接读取相册对应的URL
dispatch_async(dispatch_get_main_queue(), ^{
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
  dispatch_async(dispatch_get_main_queue(), ^{
	if (status == PHAuthorizationStatusAuthorized) {
	  [self getImageURLsFromAlbum];
	} else {
	  NSLog(@"没权限");
	}
  });
}];
});

另外说一下 这里用到的自动释放池 @autoreleasepool 顺便插一句 曾经遇到一个面试题 有一个超级大的循环计算,循环里包含大量的临时变量创建时 这时候就要用到这个了

// 获取相册图片URL的方法

- (void)getImageURLsFromAlbum {
  @autoreleasepool {
  // 获取所有用户创建的相册
   PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil];
   for (PHAssetCollection *album in userAlbums) {
     // 获取相册中的所有图片
     PHFetchResult *assets = [PHAsset fetchAssetsInAssetCollection:album options:nil];
      for (PHAsset *asset in assets) {
        // 获取图片的本地URL
        PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
        options.synchronous = NO; // 异步获取
        [[PHImageManager defaultManager] requestImageDataForAsset:asset
                                 options:options
                             resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
          NSURL *imageURL = [info objectForKey:@"PHImageFileUTIKey"];
          if (imageURL) {
            NSLog(@"图片URL: %@", imageURL);
          } else {
          }
        }];
      }
    }
  }
}

测试数据都在下面的 下面的路径部分 就是拿到的相册id 如果用户从相册中删除该照片资源自然就拿不到了

- (void)testXiangce {
  // 相册图片路径
  NSString *albumPath = @"700DB459-0810-4235-8E76-E046E000DA4B/L0/001"; // 替换成实际的相册名和图片名
  // 根据相册名查找相册
  PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
  PHFetchResult *topLevelUserCollections = [PHCollectionList fetchTopLevelUserCollectionsWithOptions:nil];
  self.fetchResults = @[userAlbums, topLevelUserCollections];
  PHAssetCollection *targetAlbum = nil;
  NSMutableArray *albums = [NSMutableArray array];
  self.albums = [self showAlbums];
  for (int i = 0; i < self.albums.count; i++) {
    PHAssetCollection *album = self.albums[i];
    [albums addObject:album.localizedTitle];
  }
  for (PHAssetCollection *album in self.albums) {
    if ([album.localizedTitle isEqualToString:@"Recents"]) { // 替换成实际的相册名 这个地方可以从相册里面读取到
      targetAlbum = album;
      break;
    }
  }
  if (targetAlbum) {
    // 查找相册中的图片
    PHFetchResult *assets = [PHAsset fetchAssetsInAssetCollection:targetAlbum options:nil];
    for (PHAsset *asset in assets) {
     if ([asset.localIdentifier isEqualToString:albumPath]) {
        NSLog(@"%@",asset.localIdentifier);
        // 使用PHImageManager加载并显示图片
        PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
        options.synchronous = NO; // 异步加载
        [[PHImageManager defaultManager] requestImageForAsset:asset
                             targetSize:CGSizeMake(400, 700) // 指定目标大小
                             contentMode:PHImageContentModeAspectFit
                               options:options
                            resultHandler:^(UIImage *result, NSDictionary *info) {
          if (result) {
            // 在这里处理加载到的图片
            // result是加载到的图片
            dispatch_async(dispatch_get_main_queue(), ^{
              self.showImageView.image = result;
            });
         }
        }];
      }
   }
  }
}
- (PHFetchResult *)assetsInAssetCollection:(PHAssetCollection *)album{
  PHFetchOptions *options = [[PHFetchOptions alloc] init];
  options.predicate = [NSPredicate predicateWithFormat:@"mediaType in %@", @[@(PHAssetMediaTypeImage)]];
  options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]];
  return [PHAsset fetchAssetsInAssetCollection:(PHAssetCollection *)album options:options];
}

- (NSMutableArray *)showAlbums {
  PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
  PHFetchResult *topLevelUserCollections = [PHCollectionList fetchTopLevelUserCollectionsWithOptions:nil];
  self.fetchResults = @[smartAlbums, topLevelUserCollections];
  NSMutableArray *albums = [NSMutableArray array];
  for (PHFetchResult *fetchResult in self.fetchResults) {
    for (PHCollection *collection in fetchResult) {
      if ([collection isKindOfClass:[PHAssetCollection class]]) {
        PHAssetCollection *assetCollection = (PHAssetCollection *)collection;
        PHFetchResult *assets = [self assetsInAssetCollection:assetCollection];
        if (assets.count > 0) {
          if (assetCollection.assetCollectionSubtype == PHAssetCollectionSubtypeSmartAlbumUserLibrary) {
            [albums insertObject:assetCollection atIndex:0];
          } else {
            [albums addObject:assetCollection];
          }
        }
      }
    }
  }
  return albums;
}