2016-03-07 85 views
0

这只会返回照片中的部分相册,我收到的相册不包含相同数量的资产,因为照片应用中存在相应的图片。获取来自ALAssetsLibrary的所有照片

NSMutableArray *groups = [[NSMutableArray alloc] init]; 
ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init]; 
[assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll 
    usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 
     if (group) { 
      [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 
      [groups addObject:group]; 
     } else { 
      block([groups copy], nil); 
     } 
    } 
    failureBlock:^(NSError *error) { 
     block(nil, error); 
    }]; 

我需要做些什么来获得所有1000个?

+0

您可以尝试使用PHAsset照片和AVFoundation库。我使用PHAsset并访问所有图像,但我的代码在swift2.0 –

+0

可能的重复[如何从我的库中以日期顺序在所有相册中获取我的alassets?](http://stackoverflow.com/questions/11622389/how-can-i-get-my-alassets-from-my-library-in-date-order-across-all-photo-albums) – techloverr

回答

0

- (void)loadLibraryGroups 
{ 
    if (self.assetsLibrary == nil) { 
     _assetsLibrary = [[ALAssetsLibrary alloc] init]; 
    } 
    if (self.groups == nil) { 
     _groups = [[NSMutableArray alloc] init]; 
    } else { 
     [self.groups removeAllObjects]; 
    } 

    // setup our failure view controller in case enumerateGroupsWithTypes fails 
    ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error) { 

     NSString *errorMessage = nil; 
     switch ([error code]) { 
      case ALAssetsLibraryAccessUserDeniedError: 
      case ALAssetsLibraryAccessGloballyDeniedError: 
       errorMessage = @"The user has declined access to it."; 
       break; 
      default: 
       errorMessage = @"Reason unknown."; 
       break; 
     } 
    }; 

    // emumerate through our groups and only add groups that contain photos 
    ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop) { 

     ALAssetsFilter *onlyPhotosFilter = [ALAssetsFilter allPhotos]; 
     [group setAssetsFilter:onlyPhotosFilter]; 
     if ([group numberOfAssets] > 0) 
     { 
      NSLog(@"group ==> %@",group); 
      [self.groups addObject:group]; 
     } 
     else 
     { 
      NSLog(@"Empty Groups load all items"); 

      for (ALAssetsGroup *group in self.groups) { 
       [self loadImageForEachGroup:group]; 
      } 

     } 
    }; 

    // enumerate only photos 
    NSUInteger groupTypes = ALAssetsGroupAlbum | ALAssetsGroupEvent | ALAssetsGroupFaces | ALAssetsGroupSavedPhotos; 
    [self.assetsLibrary enumerateGroupsWithTypes:groupTypes usingBlock:listGroupBlock failureBlock:failureBlock]; 

    NSLog(@"finish load groups"); 
} 

- (void)loadImageForEachGroup:(ALAssetsGroup *)group 
{ 
    if (!self.assets) { 
     _assets = [[NSMutableArray alloc] init]; 
    } else { 
     [self.assets removeAllObjects]; 
    } 

    ALAssetsGroupEnumerationResultsBlock assetsEnumerationBlock = ^(ALAsset *result, NSUInteger index, BOOL *stop) { 
     if (result != nil) { 
      [self.assets addObject:result]; 
     } else { 
      [self.collectionView reloadData]; 
     } 
    }; 

    ALAssetsFilter *onlyPhotosFilter = [ALAssetsFilter allPhotos]; 
    [group setAssetsFilter:onlyPhotosFilter]; 
    [group enumerateAssetsUsingBlock:assetsEnumerationBlock]; 
} 

和负载收集

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
{ 
    return self.assets.count; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"photoCell"; 

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath]; 
    // Configure the cell 

    // load the asset for this cell 
    ALAsset *asset = self.assets[indexPath.row]; 
    CGImageRef thumbnailImageRef = [asset thumbnail]; 
    UIImage *thumbnail = [UIImage imageWithCGImage:thumbnailImageRef]; 

    // apply the image to the cell 
    UIImageView *imageView = (UIImageView *)[cell viewWithTag:1]; 
    imageView.image = thumbnail; 

    return cell; 
} 
+0

但这只是问题..'[group numberOfAssets]'doesn' t返回照片包含的相同数量的资产..... –