在这里用块和 ALAssetLibrary 例程有点挣扎。我已经浏览了 WWDC + Stanford 视频块并阅读了一些内容,但对我来说还没有完全点击。
我想要做的是获取自定义照片库的海报图像。下面的第一个例程在我的主 viewController 中,并调用getPosterImageForAlbum:
ALAssetLibrary 类扩展中的函数。
我正在努力/困惑/尝试过的事情:
我应该传入一个引用(CGImageRef 或 UIImage)并让 ALAssetLibrary 方法设置它还是为 ALAssetLibrary 方法定义一个返回值,然后在我的主类中处理图像?我已经尝试了两种方式都没有成功。
ALAssetLibrary 枚举方法的异步性质有点难以使用 - 所以我想我做错了。
定义要作为参数传递的块:我总是需要 typedef 吗?
我想我已经掌握了所有概念性的点点滴滴,但我还没有能够将它们整理成对使用块的清晰理解。任何关于好文章的提示或指针*将不胜感激。//
- (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;
}