请允许我先说这是我第一次使用 ALAssetsLibrary。我需要访问用户保存的照片库中的最新照片。似乎要做到这一点,我必须创建一个 ALAssetsLibrary 实例并在选择最后一个图像之前遍历用户库中的每个项目。这总是最坏的情况。有没有更快/更好的方法来解决这个问题?
4 回答
您不必枚举用户图库中的所有照片。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)
那这个呢:
[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。