Мне нужно получить имена всех PHAsset
, существующих в Фотопленке, по отдельности и за короткое время. Чтобы получить имя файла, я использую задокументированное свойство originalFilename
файла PHAssetResource
, связанное с файлом PHAsset
. Это отлично работает для первых ассетов, но в какой-то момент (примерно после 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);
}
При использовании недокументированных методов для получения имени файла, таких как [asset valueForKey@"filenamme"]
или ключ PHImageFileURLKey
словаря info
, возвращаемого PHImageManager
, все работает хорошо (хотя имя отличается от originalFilename
, и это ненадежно, поскольку не задокументировано) .
Почему официальный метод так ненадежен? Я что-то делаю не так?