这里的 block 和 ALAssetLibrary 例程有点困难。我已经看过 WWDC + 斯坦福大学关于区 block 的视频并阅读了一些内容,但还没有完全吸引我。
我想做的是获取自定义照片库的海报图像。下面的第一个例程位于我的主 viewController 中,并调用 ALAssetLibrary 类扩展中的函数 getPosterImageForAlbum:
。
我正在努力/困惑/尝试过的事情:
我应该传入一个引用(CGImageRef 或 UIImage)并拥有 ALAssetLibrary 方法设置它或定义一个返回值 ALAssetLibrary 方法,然后在我的主类中处理图像? 我两种方法都试过了,都没有成功。
ALAssetLibrary 枚举方法的异步性质是 有点难以合作 - 所以我想我做错了。
定义一个要作为参数传递的 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/