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

1

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

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

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

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

Спасибо!

Ваш Ответ

2   ответа
0

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

РЕДАКТИРОВАТЬОкей, так вотs код из другого вопроса с парой изменений. 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;
}];
</phassetcollection>

Это победилоне включают умные альбомы (и, по моему опыту, они нене имеют действительногорасчетный счет "), так что вы можете альтернативно получить активы, чтобы получить фактическое количество:

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;
}];
</phasset></phasset></phassetcollection>

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

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

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