2011-06-13 10 views
9

Permítanme prólogo al decir que esta es la primera vez que uso ALAssetsLibrary. Necesito acceder a la foto más reciente en la galería de fotos guardada del usuario. Parece que para hacer esto, tengo que crear una instancia de ALAssetsLibrary e iterar sobre cada elemento en la galería del usuario antes de seleccionar la última imagen. Este es siempre el peor de los casos. ¿Hay una manera más rápida/mejor de abordar este problema?Acceda a una sola imagen con ALAssetsLibrary

Respuesta

15

No es necesario enumerar todas las fotos en la galería del usuario. La clase ALAssetsGroup tiene un método - (void)enumerateAssetsAtIndexes:(NSIndexSet *)indexSet options:(NSEnumerationOptions)options usingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock que puede usar para indicar qué activos desea enumerar.

En su caso, es solo el último, configure indexSet en [NSIndexSet indexSetWithIndexesInRange:NSMakeRange([group numberOfAssets]-1, [group numberOfAssets]) donde group es su ALAssetsGroup.

Como @mithuntnt mencionado, se puede obtener el ALAssetsGroup para la biblioteca de fotos usando [[assetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop)

+0

Gracias, ¡Rock! Eso es justo lo que estaba buscando. – Jacob

+1

Pequeño error en la respuesta anterior si estás usando esto. NSMakeRange ([group numberOfAssets] -1, [group numberOfAssets]) debería ser NSMakeRange ([group numberOfAssets] -1, 1) (el segundo param de nsmakerange es el recuento, no el índice final). Alternativamente, [NSIndexSet indexSetWithIndex: [group numberOfAssets] -1] es ligeramente más eficiente. –

0

http://developer.apple.com/library/ios/#documentation/AssetsLibrary/Reference/ALAssetsLibrary_Class/Reference/Reference.html

Sólo hay un método de enumeración. Entonces esta es la única forma.

Necesitaba las últimas fotos importadas. Puede tener algún filtro similar a esto.

[[assetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 
    if(group) 
    { 
     NSString * groupName = [group valueForProperty:ALAssetsGroupPropertyName]; 

     if([@"Last Import" isEqualToString:groupName]) 
     { 
      *stop = true; 

...

1

Qué tal esto:

[group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { 
    if (result) { 
     *stop = YES; 
     //... 
    } 
}]; 
0

no aparece la respuesta aceptada para trabajar si usted está enumerando una ALAssetGroup que ha establecido un filtro (porque [group numberOfAssets] devuelve el total de activos en lugar de los activos totales después del filtrado).

He utilizado este:

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); 
    } 

}]; 

}

En su completionBlock, asegúrese de comprobar que la ALAsset devuelto = nil!.

Cuestiones relacionadas