Доступ к одному изображению с помощью ALAssetsLibrary - PullRequest
9 голосов
/ 14 июня 2011

Позвольте мне предварить это, сказав, что я впервые использую ALAssetsLibrary. Мне нужно получить доступ к самой последней фотографии в сохраненной фотогалерее пользователя. Похоже, что для этого мне нужно создать экземпляр ALAssetsLibrary и перебрать каждый элемент в галерее пользователя, прежде чем выбрать последнее изображение. Это всегда худший сценарий. Есть ли более быстрый / лучший способ решения этой проблемы?

Ответы [ 4 ]

15 голосов
/ 29 июля 2011

Вам не нужно перечислять все фотографии в галерее пользователя.Класс ALAssetsGroup имеет метод - (void)enumerateAssetsAtIndexes:(NSIndexSet *)indexSet options:(NSEnumerationOptions)options usingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock, который можно использовать для указания того, какие активы вы хотите перечислить.

В вашем случае это только последний, поэтому установите indexSet на [NSIndexSet indexSetWithIndexesInRange:NSMakeRange([group numberOfAssets]-1, [group numberOfAssets]), где group - ваша ALAssetsGroup.

Как уже упоминалось @mithuntnt, вы можете получить ALAssetsGroup для библиотеки фотографий, используя [[assetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop)

1 голос
/ 31 января 2012

Что по этому поводу:

[group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
    if (result) {
       *stop = YES;
       //...
    }
}];
0 голосов
/ 03 марта 2014

Принятый ответ не работает, если вы перечисляете ALAssetGroup, для которого вы установили фильтр (потому что [group numberOfAssets] возвращает суммарные активы, а не общие активы после фильтрации).

Я использовал это:

typedef void(^SMKMostRecentPhotoCompletionBlock)(ALAsset *asset);

- (void)mostRecentPhotoWithCompletionBlock:(SMKMostRecentPhotoCompletionBlock)completionBlock
{
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {

    __block ALAsset *mostRecentPhoto = nil;

    if (group)
    {
        [group setAssetsFilter:[ALAssetsFilter allPhotos]];
        [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {

            if (result != NULL)
            {
                mostRecentPhoto = result;
                *stop = YES;
            }

        }];
    }

    if (completionBlock)
    {
        completionBlock(mostRecentPhoto);
    }

} failureBlock:^(NSError *error) {

    if (completionBlock)
    {
        completionBlock(nil);
    }

}];

}

В вашем completionBlock убедитесь, что возвращенный ALAsset! = Nil.

0 голосов
/ 18 июля 2011

http://developer.apple.com/library/ios/#documentation/AssetsLibrary/Reference/ALAssetsLibrary_Class/Reference/Reference.html

Существует только один метод перечисления.Так что это единственный способ.

Мне нужны были последние импортированные фотографии.Вы можете иметь фильтр, похожий на этот.

[[assetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
    if( group )
    {
        NSString * groupName = [group valueForProperty:ALAssetsGroupPropertyName];

        if( [@"Last Import" isEqualToString:groupName] )
        {
            *stop = true;

...

...