从相机胶卷中异步获取所有图像
Posted
技术标签:
【中文标题】从相机胶卷中异步获取所有图像【英文标题】:Get All Images from cameraroll asynchrously 【发布时间】:2015-09-09 06:23:54 【问题描述】:我想 现在我正在使用该代码,但我的应用程序被挂起,直到检索到所有图像,我注意到在 instigram 或其他应用程序中从camerroll加载图片不需要时间。
-(void)getAllPictures
NSLog(@"i m in ");
imageArray=[[NSArray alloc] init];
mutableArray =[[NSMutableArray alloc]init];
NSMutableArray* assetURLDictionaries = [[NSMutableArray alloc] init];
library = [[ALAssetsLibrary alloc] init];
void (^assetEnumerator)( ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop)
NSLog(@"i m in block");
if(result != nil)
if([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto])
NSLog(@"result not nill");
[assetURLDictionaries addObject:[result valueForProperty:ALAssetPropertyURLs]];
NSURL *url= (NSURL*) [[result defaultRepresentation]url];
NSLog(@"url=%@",url);
[library assetForURL:url
resultBlock:^(ALAsset *asset)
[mutableArray addObject:[UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage]]];
imageArray=[[NSArray alloc] initWithArray:mutableArray];
[self allPhotosCollected:imageArray];
if ([mutableArray count]==count)
NSLog(@"condition %lu , %i",(unsigned long)mutableArray.count,count);
imageArray=[[NSArray alloc] initWithArray:mutableArray];
[self allPhotosCollected:imageArray];
failureBlock:^(NSError *error) NSLog(@"operation was not successfull!"); ];
;
NSLog(@"image array= %@",imageArray);
NSMutableArray *assetGroups = [[NSMutableArray alloc] init];
void (^ assetGroupEnumerator) ( ALAssetsGroup *, BOOL *)= ^(ALAssetsGroup *group, BOOL *stop)
if(group != nil)
NSLog(@"group not nill");
[group enumerateAssetsUsingBlock:assetEnumerator];
[assetGroups addObject:group];
count=(int)[group numberOfAssets];
;
assetGroups = [[NSMutableArray alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupAll
usingBlock:assetGroupEnumerator
failureBlock:^(NSError *error) NSLog(@"There is an error");];
-(void)allPhotosCollected:(NSArray*)imgArray
//write your code here after getting all the photos from library...
NSLog(@"all pictures are %@",imgArray);
[_collection_view reloadData];
/*
CGRect collectionFrame = self.collection_view.frame;
collectionFrame.size.height=700;
collectionFrame.size.width=320;*/
self.verticalLayoutConstraint.constant = 700;
//self.collection_view.frame=collectionFrame;
【问题讨论】:
【参考方案1】:像这样尝试..它的速度越来越快。如果您将获取数组中的所有图像,那么它会在使用包含 1000 多张照片的 iPhone 和 iPad 时使您的应用程序崩溃。所以试试这样。
library = [[ALAssetsLibrary alloc] init];
if (library == nil)
library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop)
[group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop)
if (asset)
[imageArray addObject:asset];
[collectionViewObj reloadData];
];
failureBlock:^(NSError *error)
UIAlertView *alertViewObj = [[UIAlertView alloc]initWithTitle:@"Max6Miz does not have access to your photos" message:@"You can enable access in Settings" delegate:self cancelButtonTitle:nil otherButtonTitles:@"Settings",@"Ok", nil];
[alertViewObj show];
NSLog(@"error");
];
使用 collectionView cellForItemAtIndexPath
在您的委托函数中显示您的图像ALAsset *asset = (ALAsset *)imageArray[indexPath.row];
UIImage *showingImage = [UIImage imageWithCGImage:[asset thumbnail]];
【讨论】:
在这种情况下,我们如何才能获得完整的图像?例如,当我们点击缩略图时,我想使用原始图像 感谢我从这里获得全屏图像***.com/questions/21494338/…【参考方案2】:请使用ios 8.0
提供的新现代Photos framework
。我已经在我自己的iCloud Photo Library
存储在数百个相册中的 50k 照片和 1.5k 视频上对其进行了测试。它运行速度很快,可以跟踪专辑和资产的变化并为其设置动画。
这是一篇以Photos framework
开头的好文章:https://www.objc.io/issues/21-camera-and-photos/the-photos-framework/
【讨论】:
感谢您的回复,但我对 alasset 库很熟悉,我更喜欢它以上是关于从相机胶卷中异步获取所有图像的主要内容,如果未能解决你的问题,请参考以下文章