ここでは、ブロックと ALAssetLibrary ルーチンに少し苦労しています。ブロックに関する WWDC + スタンフォードのビデオを見て、少し読んだことがありますが、まだ十分に理解できていません。
私がやろうとしているのは、カスタム フォト ライブラリの posterImage を取得することです。以下の最初のルーチンはメインの 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;
}