9

请允许我先说这是我第一次使用 ALAssetsLibrary。我需要访问用户保存的照片库中的最新照片。似乎要做到这一点,我必须创建一个 ALAssetsLibrary 实例并在选择最后一个图像之前遍历用户库中的每个项目。这总是最坏的情况。有没有更快/更好的方法来解决这个问题?

4

4 回答 4

15

您不必枚举用户图库中的所有照片。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)

于 2011-07-29T10:42:08.047 回答
1

那这个呢:

[group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
    if (result) {
       *stop = YES;
       //...
    }
}];
于 2012-01-31T02:41:08.650 回答
0

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;

...

于 2011-07-18T19:26:29.617 回答
0

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。

于 2014-03-03T18:58:16.487 回答