ios - 按专辑名称获取 ALAssetsGroupAlbum 的海报图像

标签 ios objective-c-blocks alassetslibrary

这里的 block 和 ALAssetLibrary 例程有点困难。我已经看过 WWDC + 斯坦福大学关于区 block 的视频并阅读了一些内容,但还没有完全吸引我。

我想做的是获取自定义照片库的海报图像。下面的第一个例程位于我的主 viewController 中,并调用 ALAssetLibrary 类扩展中的函数 getPosterImageForAlbum:

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

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

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

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

我想我已经掌握了所有概念性的点点滴滴,但我还无法将它们整理成对使用 block 的清晰理解。任何关于好文章的提示或指示*将不胜感激。 //

- (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;
}

最佳答案

我正在大力编辑我原来的答案,因为只有在我发布它之后,我才真正理解你想要做什么——在 ALAssetLibrary 上编写一个类扩展,通过名称查找专辑的海报图像,而不仅仅是以任何可能的方式按名称查找专辑的海报图像。

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

- (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];
        }
    }];
}

这符合您想要做的事情吗? (抱歉进行了重大修改...)

关于ios - 按专辑名称获取 ALAssetsGroupAlbum 的海报图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14167151/

相关文章:

iphone - 无法从 Assets URL 加载图像

ios - 在 Swift 中使用 ALAsset

iphone - 使用 block 回调时如何释放对象

objective-c - 什么会导致 block 在 ARC 下不保留引用的 Objective-C 对象?

objective-c - 如何在没有死锁的情况下同步调度主队列?

ios - ALAssetsLibrary-自定义相册 ios 8

objective-c - indexOfObjectIdenticalTo : returns value outside of array count

ios - SceneKit SCNNode 初始化(mdlObject :) missing?

iphone - (iphone) 重复 : no? 时我需要使计时器无效吗

ios - 苹果 watch : Status bar height