从摄像头获取所有图像asynchronous

我想从摄像头asynchronous获取所有图像现在我正在使用该代码,但我的应用程序被绞死,直到所有的图像检索,我注意到在instigram或其他应用程序,它不需要时间来从camerroll加载图片。

-(void)getAllPictures { NSLog(@"im 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(@"im 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; } 

像这样试试..它的速度越来越快。 如果您将获得arrays中的所有图像,则会在使用包含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]]; 

请使用iOS 8.0提供的全新现代Photos framework 。 我已经在我自己的iCloud Photo Library对50k张照片和存储在数百张专辑中的1.5kvideo进行了testing。 它工作的速度很快,并允许跟踪和animation更改专辑和资产。

这里是一个很好的文章,以Photos framework开始: https : //www.objc.io/issues/21-camera-and-photos/the-photos-framework/