2011-06-13 7 views
9

ALAssetsLibrary를 처음 사용한다고 말하면서 서두를 수 있습니다. 사용자의 저장된 사진 갤러리에서 가장 최근 사진에 액세스해야합니다. 이렇게하려면 ALAssetsLibrary 인스턴스를 만들고 마지막 이미지를 선택하기 전에 사용자 갤러리의 모든 항목을 반복해야합니다. 이것은 항상 최악의 시나리오입니다. 이 문제에 접근하는 더 빠르고 좋은 방법이 있습니까?ALAssetsLibrary를 사용하여 단일 이미지에 액세스

답변

15

당신은 사용자의 갤러리에있는 모든 사진을 열거 할 필요가 없습니다. 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)

+0

감사합니다. 그것은 내가 찾고 있었던 바로 그 것이다. – Jacob

+1

당신이 이것을 사용한다면 위의 대답에 작은 버그가 있습니다. NSMakeRange ([group numberOfAssets] -1, [group numberOfAssets])는 NSMakeRange ([group numberOfAssets] -1,1) 여야합니다 (nsmakerange의 두 번째 매개 변수는 끝 인덱스가 아니라 카운트입니다). 또는 [NSIndexSet indexSetWithIndex : [group numberOfAssets] -1]이 약간 더 효율적입니다. –

0

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; 

...

1

이것에 대해 무엇을 사용하여 사진 라이브러리의 ALAssetsGroup를 얻을 수 있습니다 : 당신이 열거하는 경우

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

허용 대답이 표시되지 않는 일을하는 ALAssetGroup 필터를 설정했습니다 ([group numberOfAssets]은 필터링 후 총 애셋이 아닌 총 애셋을 반환하기 때문에). ! 그 반환 ALAsset = 전무를 확인

completionBlock에서
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); 
    } 

}]; 

}

을 확인하십시오

나는 이것을 사용했다.