如何在iPhone库中获取最新照片?

Jas*_*hao 7 iphone objective-c ios

在我的应用程序中有一个按钮,用户只需单击它,然后可以直接在屏幕上检索库中的最新照片.如何在图书馆中获取最新照片?


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];
Run Code Online (Sandbox Code Playgroud)

要获取文件日期,我使用它

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

然后我发现最新的图像总是属于assetURLArray的顶级图像,所以我终于得到了这样的最新图像

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

我不知道如果这总是有效的......希望任何人都可以证明我.

在那里,我正在寻找一种同步线程的方法......

小智 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**
Run Code Online (Sandbox Code Playgroud)


Jas*_*hao 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];
Run Code Online (Sandbox Code Playgroud)

为了获取文件日期,我使用这个:

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

然后我发现最新的图像总是位于最上面assetURLArray,所以我终于得到了这样的最新图像:

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

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

我正在寻找一种同步线程的方法......


2012-04-03 更新

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

- (void)gotLastImageCallBack {
    if (notifyName) {
        [[NSNotificationCenter defaultCenter] postNotificationName:notifyName object:nil];
    }
}
Run Code Online (Sandbox Code Playgroud)

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