过于频繁调用时,PHAsset assetResourcesForAsset失败

我需要在PHAsset检索Camera Roll中存在的所有PHAsset的名称。 要获取文件名,我使用与PHAssetResource关联的PHAsset的文档originalFilename属性。 这对于第一个资产来说工作得很好,但是在某个时候(在大约400个资产之后),它开始失败并且每次都返回nil 。 这是一个显示这种行为的代码(在iPhone 7上运行,在相机胶卷中有〜800张照片):

 PHFetchResult *result = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil]; PHAssetCollection *assetCollection = result.firstObject; PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil]; for (int i = index; i<[assets count]; i++) { PHAsset *asset = assets[i]; NSArray *resources = [PHAssetResource assetResourcesForAsset:asset]; NSString *name = (resources.count > 0) ? [(PHAssetResource*)resources.firstObject originalFilename] : nil; NSLog(@"%i: %@", i, name); } 

当使用未logging的方法来获取文件名,如PHImageFileURLKey返回的info字典的[asset valueForKey@"filenamme"]PHImageFileURLKey键时,一切正常(尽pipe名称与originalFilename不同,不可靠,因为它没有logging)。

官方的方法怎么不可靠? 有什么我做错了吗?

用这个

 if (asset) { // get photo info from this asset PHImageRequestOptions * imageRequestOptions = [[PHImageRequestOptions alloc] init]; imageRequestOptions.synchronous = YES; [[PHImageManager defaultManager] requestImageDataForAsset:asset options:imageRequestOptions resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { NSLog(@"info = %@", info); if ([info objectForKey:@"PHImageFileURLKey"]) { NSURL *path = [info objectForKey:@"PHImageFileURLKey"]; } }]; }