【发布时间】:2011-09-14 06:32:15
【问题描述】:
请允许我先说这是我第一次使用 ALAssetsLibrary。我需要访问用户保存的照片库中的最新照片。似乎要做到这一点,我必须创建一个 ALAssetsLibrary 实例并在选择最后一个图像之前遍历用户库中的每个项目。这总是最坏的情况。有没有更快/更好的方法来解决这个问题?
【问题讨论】:
标签: iphone objective-c photo alasset alassetslibrary
请允许我先说这是我第一次使用 ALAssetsLibrary。我需要访问用户保存的照片库中的最新照片。似乎要做到这一点,我必须创建一个 ALAssetsLibrary 实例并在选择最后一个图像之前遍历用户库中的每个项目。这总是最坏的情况。有没有更快/更好的方法来解决这个问题?
【问题讨论】:
标签: iphone objective-c photo alasset alassetslibrary
您不必枚举用户图库中的所有照片。
ALAssetsGroup 类有一个方法- (void)enumerateAssetsAtIndexes:(NSIndexSet *)indexSet options:(NSEnumerationOptions)options usingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock,您可以使用它来指示要枚举的资产。
在您的情况下,它只是最后一个,因此将 indexSet 设置为 [NSIndexSet indexSetWithIndexesInRange:NSMakeRange([group numberOfAssets]-1, [group numberOfAssets]) 其中 group 是您的 ALAssetsGroup。
正如@mithuntnt 提到的,您可以使用[[assetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop) 获取照片库的 ALAssetsGroup
【讨论】:
这个呢:
[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。
【讨论】: