Доступ к одному изображению с помощью ALAssetsLibrary

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


person Jacob    schedule 13.06.2011    source источник


Ответы (4)


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

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

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

person adriaan    schedule 29.07.2011
comment
Спасибо, ты крут! Это именно то, что я искал. - person Jacob; 30.07.2011
comment
Небольшая ошибка в приведенном выше ответе, если вы используете это. NSMakeRange([group numberOfAssets]-1, [group numberOfAssets]) должен быть NSMakeRange([group numberOfAssets]-1, 1) (второй параметр nsmakerange — это количество, а не конечный индекс). В качестве альтернативы [NSIndexSet indexSetWithIndex:[group numberOfAssets]-1] немного более эффективен. - person Ivo Jansch; 31.10.2012

Что насчет этого:

[group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
    if (result) {
       *stop = YES;
       //...
    }
}];
person huoxinbird    schedule 31.01.2012

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;

...

person mithuntnt    schedule 18.07.2011

Принятый ответ не работает, если вы перечисляете 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.

person Alfie Hanssen    schedule 03.03.2014