2012-02-15 28 views
7

在我的应用程序中有一个按钮,用户只需点击它即可直接在屏幕上检索库中的最新照片。如何获得库中的最新照片?如何获取iPhone库中的最新照片?


2012/02/17

此可以得到ALAsset

void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) 
    { 
     if(result != nil) 
     { 

      [self.assets addObject:result]; 

     } 
    }; 

    void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) 
    { 
     if(group != nil) 
     { 
      [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 
      [group enumerateAssetsUsingBlock:assetEnumerator]; 
     }else{ 
      self.image = [self getLastImage]; 

     } 

    }; 
    ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror){ 
     NSLog(@"error occour =%@", [myerror localizedDescription]); 
    }; 


    assets = [[NSMutableArray alloc] init]; 
    ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; 
    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:assetGroupEnumerator failureBlock:failureblock]; 
    [assetsLibrary release]; 

为了让我用这个

assetURLArray = [[NSMutableArray alloc] init]; 
    for (ALAsset *asset in self.assets) { 
     NSDate * date = [asset valueForProperty:ALAssetPropertyDate]; 

文件日期后来我发现,最新的图像总是assetURLArray的第一个,所以我最终得到了这样的最新的一个

if (self.assets && [self.assets count]) { 
     ALAsset *asset = [self.assets objectAtIndex:([self.assets count] - 1)]; 
     CGImageRef ref = [[asset defaultRepresentation]fullResolutionImage]; 

我不知道如果这总是工作...希望任何人都可以证明我。

还有我正在寻找一种方式来同步线程...

+0

你可以做'[self.assets lastObject]',它有益返回无如果计数为0. – 2012-07-21 04:44:23

回答

2

这段代码可以检索ALAsset

void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger 
index, BOOL *stop) { 
    if(result != nil) { 
     [self.assets addObject:result]; 
    } 
}; 

void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) { 
    if(group != nil) { 
     [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 
     [group enumerateAssetsUsingBlock:assetEnumerator]; 
    } else { 
     self.image = [self getLastImage]; 
    } 
}; 

ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror) { 
    NSLog(@"error occour =%@", [myerror localizedDescription]); 
}; 

assets = [[NSMutableArray alloc] init]; 
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; 
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:assetGroupEnumerator failureBlock:failureblock]; 
[assetsLibrary release]; 

为了让我用这个文件日期:

assetURLArray = [[NSMutableArray alloc] init]; 
for (ALAsset *asset in self.assets) { 
    NSDate * date = [asset valueForProperty:ALAssetPropertyDate]; 

后来我发现,最新的图像总是顶一个assetURLArray,所以我终于得到这样的最新一个:

if (self.assets && [self.assets count]) { 
    ALAsset *asset = [self.assets objectAtIndex:([self.assets count] - 1)]; 
    CGImageRef ref = [[asset defaultRepresentation] fullResolutionImage]; 

我不知道这是否总是有效......我希望有人能够清除我对此的怀疑。

还有我正在寻找一种方式来同步线程...


2012-04-03更新

现在我用NSNotification来解决这个问题:

- (void)gotLastImageCallBack { 
    if (notifyName) { 
     [[NSNotificationCenter defaultCenter] postNotificationName:notifyName object:nil]; 
    } 
} 

获取图像后,通知会将回叫发送回相关的类。

2

你需要把所有的照片创建的日期,然后按日期排序。

- (NSDictionary *) attributesForFile:(NSURL *)anURI { 

// note: singleton is not thread-safe 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSString *aPath = [anURI path]; 

if (![fileManager fileExistsAtPath:aPath]) return nil; 

NSError *attributesRetrievalError = nil; 
NSDictionary *attributes = [fileManager attributesOfItemAtPath:aPath 
          error:&attributesRetrievalError]; 

if (!attributes) { 
    NSLog(@"Error for file at %@: %@", aPath, attributesRetrievalError); 
    return nil; 
} 

NSMutableDictionary *returnedDictionary = 
    [NSMutableDictionary dictionaryWithObjectsAndKeys: 
     [attributes fileType], @"fileType", 
     [attributes fileModificationDate], @"fileModificationDate", 
     [attributes fileCreationDate], @"fileCreationDate", 
     [NSNumber numberWithUnsignedLongLong:[attributes fileSize]], @"fileSize", 
    nil]; 

return returnedDictionary; 
} 
+0

谢谢,但如何访问照片库并阅读每张专辑中的所有图像? – 2012-02-15 11:05:00

+1

http://www.icodeblog.com/2010/07/08/asset-libraries-and-blocks-in-ios-4/ – 2012-02-15 12:12:55

+0

干杯队友!!!! – 2012-02-16 05:20:41

11

你可以简单地通过以下ALAssetsGroup

(void)enumerateAssetsWithOptions:(NSEnumerationOptions)options usingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock;** 

    applying **NSEnumerationReverse** option 

    void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) 
     { 
      if(result != nil) 
      { 

       [self.assets addObject:result]; 

      } 
     }; 

     void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) 
     { 
      if(group != nil) 
      { 
       [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 
       [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:assetEnumerator]; 
      } 

     }; 
     ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror){ 
      NSLog(@"error occour =%@", [myerror localizedDescription]); 
     }; 


     assets = [[NSMutableArray alloc] init]; 
     ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; 
     [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:assetGroupEnumerator failureBlock:failureblock]; 
     [assetsLibrary release]; 


    **Your self.assets array will have latest images** 
0
UIButton *photoAlbum = [[UIButton alloc] init]; 
[photoAlbum addTarget:self action:@selector(getLatestPhoto:) forControlEvents:UIControlEventTouchDown]; 

-(void)getLatestPhoto 
{ 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 

    [library enumerateGroupsWithTypes:ALAssetsGroupLibrary usingBlock:^(ALAssetsGroup *group, BOOL *stop) 
    { 
     [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 
     if ([group numberOfAssets] > 0) 
     { 
      [group enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:[group numberOfAssets]-1] options:0 
          usingBlock:^(ALAsset *alAsset, NSUInteger index, BOOL *innerStop) 
      { 

      }]; 
     } 
    } 
     failureBlock: ^(NSError *error) 
    { 
     NSLog(@"No Photo"); 
    }]; 
} 
0

的方法,这样做只是做这个家伙

void (^enumerate)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) 
{ 
    if ([[group valueForProperty:@"ALAssetsGroupPropertyType"] intValue] == ALAssetsGroupSavedPhotos) 
    { 
     NSLog(@"Camera roll"); 
     [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { 
      if(result != nil){ 
       ALAssetRepresentation *rep = [result defaultRepresentation]; 
       [thumbnailsArray insertObject:rep atIndex:0]; 
      } 

     }]; 
    } 
相关问题