Вопрос по numbers, photos, ios, alassetslibrary – Получить количество изображений в Photos.app?

1

Я знаю, что можно получить изображения в Photos.app с помощью ALAssetsLibrary, но как мне получить общее количество фотографий в Photos.app?

В основном я пытаюсь проверить количество фотографий, потому что я получаю последнее изображение в Photos.app с кодом из этого вопроса:Получить последнее изображение из Photos.app?

Таким образом, если на устройстве 0 изображений, оно не выполнит код по ссылке выше.

Во всяком случае, как я могу получить это?

Спасибо!

Ваш Ответ

2   ответа
0

enumerateAssetsUsingBlock, каждый раз, когда результат не равен нулю, добавьте его в массив (я назову егоself.arrayOfAssets). Затем, когда вы получите нулевой результат (конечная точка перечисления), получитеself.arrayOfAssets.count.

EDITИтак, вот код из другого вопроса с парой изменений. enumerateAssetsUsingBlock: instead of enumerateAssetsAtIndexes:

Дайте себе изменяемый массив и поместите туда каждое изображение.

Затем, когда актив равняется нулю, сигнализируя, что перечисление завершено, подсчитайте массив.

    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");
  }];
Я немного понимаю, но я в замешательстве. Можете ли вы связать это с другим вопросом, на который я указал? SimplyKiwi
5

Photos Framework, представленный в iOS 8, можно использовать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;
}];

Это не будет включать смарт-альбомы (и, по моему опыту, они не имеют действительных «оценочных показателей»), так что вы можете альтернативно получить ресурсы для получения действительного значения:

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;
}];

И, кстати, если вы еще не запросили авторизацию для библиотеки, вы должны сделать это, например:

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

Со старымAssetsLibrary рамки, вы можете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
@atulkhatri - Совершенно верно, вы должны использоватьPHAssetCollectionTypeSmartAlbum чтобы получить умные альбомы (например, «Фотопленка» и т. д.). Но вы также должны использоватьPHAssetCollectionTypeAlbum чтобы получить остальные альбомы, например, они синхронизируются из iTunes и создаются приложениями. Смотрите пересмотренный ответ.
Любая идея, как это сделать в новомPhotos фреймворк?
Спасибо за быстрое редактирование. Я получил мой на работу с помощьюPHFetchResult *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; который дал мне точно такой же результат, как по умолчаниюPhotos приложение.

Похожие вопросы