ALAssetsLibrary를 처음 사용한다고 말하면서 서두를 수 있습니다. 사용자의 저장된 사진 갤러리에서 가장 최근 사진에 액세스해야합니다. 이렇게하려면 ALAssetsLibrary 인스턴스를 만들고 마지막 이미지를 선택하기 전에 사용자 갤러리의 모든 항목을 반복해야합니다. 이것은 항상 최악의 시나리오입니다. 이 문제에 접근하는 더 빠르고 좋은 방법이 있습니까?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)
하나 개 열거 방법이있다. 그래서 이것이 유일한 방법입니다.
마지막으로 가져온 사진이 필요했습니다. 이와 유사한 필터를 사용할 수 있습니다.
[[assetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if(group)
{
NSString * groupName = [group valueForProperty:ALAssetsGroupPropertyName];
if([@"Last Import" isEqualToString:groupName])
{
*stop = true;
...
이것에 대해 무엇을 사용하여 사진 라이브러리의 ALAssetsGroup를 얻을 수 있습니다 : 당신이 열거하는 경우
가[group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
if (result) {
*stop = YES;
//...
}
}];
허용 대답이 표시되지 않는 일을하는 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);
}
}];
}
을 확인하십시오
나는 이것을 사용했다.
감사합니다. 그것은 내가 찾고 있었던 바로 그 것이다. – Jacob
당신이 이것을 사용한다면 위의 대답에 작은 버그가 있습니다. NSMakeRange ([group numberOfAssets] -1, [group numberOfAssets])는 NSMakeRange ([group numberOfAssets] -1,1) 여야합니다 (nsmakerange의 두 번째 매개 변수는 끝 인덱스가 아니라 카운트입니다). 또는 [NSIndexSet indexSetWithIndex : [group numberOfAssets] -1]이 약간 더 효율적입니다. –