按照专辑名称获取ALAssetsGroupAlbum的posterImage

时间:2013-01-05 00:23:51

标签: ios objective-c-blocks alassetslibrary

使用块和ALAssetLibrary例程在这里苦苦挣扎。我已经浏览了WWDC + Stanford的视频并阅读了一些内容,但它还没有为我点击过。

我要做的是获取自定义照片库的posterImage。下面的第一个例程在我的主viewController中,并调用ALAssetLibrary类扩展中的函数getPosterImageForAlbum:

我正在努力/困惑/尝试过的事情:

  1. 我应该传入一个引用(CGImageRef或UIImage)并拥有 ALAssetLibrary方法设置它或为其定义返回值 ALAssetLibrary方法然后处理我的主类中的图像? 我已经尝试过两种方式都没有成功。

  2. ALAssetLibrary枚举方法的异步特性是 有点难以使用 - 所以我想我做错了。

  3. 定义要作为参数传递的块:我是否总是需要 typedef吗?

  4. 我想我已经把所有概念上的点点滴滴旋转了但是我还没有能够将它们纠缠在一起清楚地理解使用块。任何有关优秀文章的提示或指示都将非常感激。 //

    - (IBAction)getPosterImage:(id)sender {
    
        NSString *groupName = self.groupNameField.text;
        NSLog(@"%@", groupName);
    
        __weak typeof(self) weakSelf = self;
    
       CGImageRef tmpImg = [weakSelf.library getPosterImageForAlbum:groupName withCompletionBlock:(CGImageRef)(^GetPosterImageCompletion)(NSError *error){
            if (error!=nil) {
                NSLog(@"getPosterImage error: %@", [error description]);
            } else {
                if (tmpImg != nil){
                    UIImage * posterImg = [UIImage imageWithCGImage:tmpImg];
                    weakSelf.pImage.image = posterImg;
                }
            }
        }];
    }
    

    //这是ALAssetLibrary

    的扩展
    typedef CGImageRef(^GetPosterImageCompletion)(NSError* error);
    
    -(CGImageRef)getPosterImageForAlbum:(NSString*)albumName
                    withCompletionBlock:(GetPosterImageCompletion)completionBlock
    {
        __block BOOL albumWasFound = NO;
        __block CGImageRef thePosterImage = nil;
    
        SaveImageCompletion test;
        //search all photo albums in the library
        [self enumerateGroupsWithTypes:ALAssetsGroupAlbum
                            usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
    
                NSLog(@"this group name: %@",
                      [group valueForProperty:ALAssetsGroupPropertyName]);
    
                //compare the names of the albums              
                if ([albumName compare:
                     [group valueForProperty:ALAssetsGroupPropertyName]]==NSOrderedSame) {
    
                    printf("matches \n");    //target album is found
                    albumWasFound = YES;
                    thePosterImage = group.posterImage;
                    *stop = true;
                    return ;
                }
    
            } failureBlock: test];
    
        if (albumWasFound==NO) {
            NSLog(@"%@", @"No group found");
        }
        return thePosterImage;
    }
    

1 个答案:

答案 0 :(得分:2)

我正在大力编辑我的原始答案,因为只有在我发布之后我真的明白你要做什么 - 在ALAssetLibrary上写一个类扩展,找到一个专辑的海报形象,而不仅仅是以任何可能的方式按名称查找专辑的海报图像。

我会通过编写一个扩展方法来处理这个问题,该方法接受一个接受UIImage类型的单个参数(或者可选的NSError参数)的完成块作为参数。在该完成块中,调用者可以使用异步返回的图像执行他们想要的任何操作。无需键入块 - 您可以这样编写方法:

- (void) getPosterImageForAlbumNamed: (NSString *) albumName completionBlock: (void (^)(UIImage *, NSError *)) completionBlock
{
    __block ALAssetsGroup * foundAlbum = nil;
    [self enumerateGroupsWithTypes: ALAssetsGroupAlbum
                           usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
                               if (group) {
                                   if ([(NSString *) [group valueForProperty: ALAssetsGroupPropertyName] compare: albumName] == NSOrderedSame) {
                                       *stop = YES;
                                       foundAlbum = group;
                                       completionBlock([UIImage imageWithCGImage: [group posterImage]], nil);
                                   }
                               } else{
                                   if (! foundAlbum) {
                                       NSLog(@"Album wasn't found");
                                       // completionBlock(nil, XX SOME ERROR XX);
                                   }
                               }
                           } failureBlock:^(NSError *error) {
                               NSLog(@"Couldn't access photo library");
                               // completionBlock(nil, XX SOME ERROR XX);
                           }];

}

然后,您可以这样调用方法:

-(IBAction) getPosterForAlbum: (id) sender
{
    NSString * albumName = self.textField.text;
    ALAssetsLibrary * library = [[ALAssetsLibrary alloc] init];

    __weak typeof(self) weakSelf = self;
    [library getPosterImageForAlbumNamed: albumName completionBlock:^(UIImage * image, NSError * error) {
        if (! error) {
            [weakSelf doSomethingWithPosterImage: image];
        }
    }];
}

这是否与你想要做的一致? (抱歉主要编辑...)