ios numbers photos alassetslibrary

ios - Obtener el número de imágenes en Photos.app?



numbers alassetslibrary (2)

Sé que es posible obtener las imágenes en Photos.app utilizando ALAssetsLibrary, pero ¿cómo obtengo el número total de fotos en Photos.app?

Casi estoy intentando verificar el número de fotos porque obtengo la última imagen en Photos.app con el código de esta pregunta: ¿ Obtiene la última imagen de Photos.app?

Entonces, si hay 0 imágenes en el dispositivo, no ejecutará el código desde el enlace de arriba.

De todos modos, ¿cómo puedo obtener esto?

¡Gracias!


use enumerateAssetsUsingBlock . cada vez que el resultado no es nulo, agréguelo a una matriz (lo llamaré self.arrayOfAssets ). Luego, cuando obtiene un resultado nulo (el punto terminal de la enumeración), obtenga self.arrayOfAssets.count .

EDITAR : Bien, aquí está el código de la otra pregunta con un par de cambios. Use enumerateAssetsUsingBlock: instead of enumerateAssetsAtIndexes:

Date una matriz mutable y pon cada imagen allí.

Luego, cuando el activo no indique que la enumeración ha terminado, cuente la matriz.

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; self.allPhotos = [[NSMutableArray alloc] init]; // Enumerate just the photos and videos group by using ALAssetsGroupSavedPhotos. [library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) { // Within the group enumeration block, filter to enumerate just photos. [group setAssetsFilter:[ALAssetsFilter allPhotos]]; [group enumerateAssetsUsingBlock:^(ALAsset *alAsset, NSUInteger index, BOOL *innerStop) { // The end of the enumeration is signaled by asset == nil. if (alAsset) { ALAssetRepresentation *representation = [alAsset defaultRepresentation]; UIImage *latestPhoto = [UIImage imageWithCGImage:[representation fullScreenImage]]; [self.allPhotos addObject:latestPhoto]; if (!asset){ NSLog:(@"photos count:%d", self.allPhotos.count); } } }]; } failureBlock: ^(NSError *error) { // Typically you should handle an error more gracefully than this. NSLog(@"No groups"); }];


Con el nuevo marco de Photos , presentado en iOS 8, puede usar estimatedAssetCount :

NSUInteger __block estimatedCount = 0; PHFetchResult <PHAssetCollection *> *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil]; [collections enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOL * _Nonnull stop) { estimatedCount += collection.estimatedAssetCount; }];

Eso no incluirá los álbumes inteligentes (y, en mi experiencia, no tienen "recuentos estimados" válidos), por lo que alternativamente puede recuperar los activos para obtener el conteo real:

NSUInteger __block count = 0; // Get smart albums (e.g. "Camera Roll", "Recently Deleted", "Panoramas", "Screenshots", etc. PHFetchResult <PHAssetCollection *> *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; [collections enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOL * _Nonnull stop) { PHFetchResult <PHAsset *> *assets = [PHAsset fetchAssetsInAssetCollection:collection options:nil]; count += assets.count; }]; // Get the standard albums (e.g. those from iTunes, created by apps, etc.), too collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil]; [collections enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOL * _Nonnull stop) { PHFetchResult <PHAsset *> *assets = [PHAsset fetchAssetsInAssetCollection:collection options:nil]; count += assets.count; }];

Y, dicho sea de paso, si aún no ha solicitado la autorización para la biblioteca, debe hacerlo, por ejemplo:

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { if (status == PHAuthorizationStatusAuthorized) { // insert your image counting logic here } }];

Con el antiguo marco de AssetsLibrary , puede enumerateGroupsWithTypes :

NSUInteger __block count = 0; [library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) { if (!group) { // asynchronous counting is done; examine `count` here } else { count += group.numberOfAssets; } } failureBlock:^(NSError *err) { NSLog(@"err=%@", err); }]; // but don''t use `count` here, as the above runs asynchronously