2012-02-28 10 views
2

私はIOSにはかなり新しいです。私はviewDidLoadのデバイス上のすべての写真を取得したいです。コード内でNSLog(@"%d", photos.count)と呼んだ後では、ブロックは常に次のように実行されます。そのようなケースを扱うには? ALAssetsLibrary documentation状態としてブロックの実行は常に遅くなります

__block NSMutableArray* photos = [[[NSMutableArray alloc] init] retain]; 

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 

void (^assertsEnumerator)(ALAsset *, NSUInteger , BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) 
{ 
     if(result) 
     { 
      NSLog(@"Assert name : %@", [result valueForProperty:ALAssetPropertyURLs]);   
      [photos addObject:[UIImage imageWithCGImage:[result aspectRatioThumbnail]]]; 
     } 
}; 

void (^groupEnumerator)(ALAssetsGroup*, BOOL*) = ^(ALAssetsGroup *group, BOOL *stop) { 
    if(group != nil) { 
     NSLog(@"Adding group %@", [group valueForProperty:ALAssetsGroupPropertyName]); 
     [group enumerateAssetsUsingBlock: assertsEnumerator]; 
    } 
}; 

[library enumerateGroupsWithTypes: ALAssetsGroupSavedPhotos 
         usingBlock:groupEnumerator 
        failureBlock:^(NSError * err) {NSLog(@"Erorr: %@", [err localizedDescription]);}]; 
[library release]; 
NSLog(@"%d", photos.count); 
[photos release]; 

答えて

3

enumerateGroupsWithTypes:usingBlock:failureBlock:は非同期なので、代わりの場所で呼び出されているのには、次の実行ループサイクル内から呼び出さされる予定です。ドキュメントには、その理由と進行方法が明確に記載されています。

このメソッドは非同期です。グループが列挙されると、ユーザーはデータへのアプリケーションのアクセスを確認するよう求められます。ただし、このメソッドはすぐに戻ります。アセットを使用して作業を行う場合は、enumerationBlockにしてください。

+0

ありがとう、ayoy!enumerationBlockで値を返す必要がある場合はどうすればよいですか?デリゲートの今後のコールバック関数でその価値が必要な場合、どうすればいいですか? – Jin

+1

あなたは単にそれを行うことはできません。あなたは何とかそれを回避しなければなりません。例えば、 [この質問とトップの回答](http://stackoverflow.com/questions/9474018/returning-uiimage-from-block) – ayoy

関連する問題