Позвольте мне предварить это, сказав, что я впервые использую ALAssetsLibrary. Мне нужно получить доступ к самой последней фотографии в сохраненной фотогалерее пользователя. Кажется, для этого мне нужно создать экземпляр ALAssetsLibrary и перебрать каждый элемент в галерее пользователя, прежде чем выбрать последнее изображение. Это всегда худший сценарий. Есть ли более быстрый/лучший способ решить эту проблему?
Доступ к одному изображению с помощью ALAssetsLibrary
Ответы (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)
Что насчет этого:
[group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
if (result) {
*stop = YES;
//...
}
}];
Существует только один метод перечисления. Так что это единственный способ.
Мне нужны были последние импортированные фотографии. У вас может быть фильтр, похожий на этот.
[[assetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if( group )
{
NSString * groupName = [group valueForProperty:ALAssetsGroupPropertyName];
if( [@"Last Import" isEqualToString:groupName] )
{
*stop = true;
...
Принятый ответ не работает, если вы перечисляете 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.