问题描述
|
首先,请允许我说这是我第一次使用ALAssetsLibrary。我需要访问用户保存的照片库中的最新照片。似乎要这样做,我必须创建一个ALAssetsLibrary实例,并在选择最后一个图像之前遍历用户库中的每个项目。这始终是最坏的情况。是否有更快/更好的方法来解决此问题?
解决方法
您不必枚举用户画廊中的所有照片。
ALAssetsGroup类具有方法“ 0”,可用于指示要枚举的资产。
在您的情况下,它只是最后一个,因此将indexSet设置为“ 1”,其中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;
//...
}
}];
, 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;
...
, 如果您枚举设置了过滤器的ѭ5,那么接受的答案似乎无效。(因为[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,BOOL *stop) {
if (result != NULL)
{
mostRecentPhoto = result;
*stop = YES;
}
}];
}
if (completionBlock)
{
completionBlock(mostRecentPhoto);
}
} failureBlock:^(NSError *error) {
if (completionBlock)
{
completionBlock(nil);
}
}];
}
在completionBlock
中,确保检查返回的ALAsset!= nil。