2011-06-13 17 views
9

Bunun, ALAssetsLibrary'i ilk defa kullanıyorum diyerek bunu ön izlememize izin verin. Kullanıcının kayıtlı fotoğraf galerisinde en son fotoğrafa erişmem gerekiyor. Bunu yapmak için, bir ALAssetsLibrary örneği oluşturmalı ve son görüntüyü seçmeden önce kullanıcının galerisindeki her öğe üzerinde yinelemeliyim. Bu her zaman en kötü durum senaryosudur. Bu probleme yaklaşmanın daha hızlı/daha iyi bir yolu var mı?ALAssetsLibrary ile tek bir görüntüye erişme

cevap

15

Kullanıcının galerisinde fotoğrafları numaralandırmak yok. ALAssetsGroup sınıfı, numaralandırmak istediğiniz varlıkları belirtmek için kullanabileceğiniz - (void)enumerateAssetsAtIndexes:(NSIndexSet *)indexSet options:(NSEnumerationOptions)options usingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock yöntemine sahiptir.

Sizin durumunuzda, yalnızca sonuncu set upSetSet [NSIndexSet indexSetWithIndexesInRange:NSMakeRange([group numberOfAssets]-1, [group numberOfAssets]) için burada ALAssetsGroup grubudur.

@mithuntnt belirtildiği gibi, [[assetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop)

+0

Sağol! Tam da aradığım şey bu. – Jacob

+1

Bunu kullanıyorsanız, yukarıdaki yanıttaki küçük hata. NSMakeRange ([group numberOfAssets] -1, [group numberOfAssets]), NSMakeRange olmalıdır ([group numberOfAssets] -1, 1) (nsmakerange'ın ikinci param sayısı, end endeksi değil). Alternatif olarak, [NSIndexSet indexSetWithIndex: [group numberOfAssets] -1] biraz daha verimli. –

0

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

tek numaralandırma yöntemi yoktur. Yani bu tek yol.

Son içe aktarılan fotoğraflara ihtiyacım vardı. Buna benzer bir filtreniz olabilir.

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

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

...

1

bu konuda ne kullanarak fotoğraf kütüphanesi için ALAssetsGroup alabilirsiniz: Bir numaralandırma eğer

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

kabul cevap görünmüyor çalışmak Bir filtre ayarladığınız ALAssetGroup ([group numberOfAssets], filtrelemeden sonra toplam varlıkları değil, toplam varlıkları döndürür). ! O döndü ALAsset = nil kontrol etmek

senin completionBlock yılında
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); 
    } 

}]; 

}

, emin olun:

bunu kullandım.

İlgili konular