2012-02-28 78 views
2

我對IOS很新。我想在viewDidLoad的設備上獲取所有圖片。但是我在代碼中調用NSLog(@"%d", photos.count)後總是執行該代碼塊,如下所示。如何處理這種情況?塊的執行總是延遲

__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

隨着ALAssetsLibrary documentation狀態,enumerateGroupsWithTypes:usingBlock:failureBlock:是異步的,所以反而被稱爲就位,它計劃從下一個運行循環週期內調用。該文檔清楚地說明了什麼原因以及您應該如何繼續:

此方法是異步的。枚舉組時,可能會要求用戶確認應用程序對數據的訪問權限;該方法雖然立即返回。您應該使用enumerationBlock中的資產執行您想要的任何工作。

+0

謝謝,ayoy!如果我需要返回enumerationBlock中的值,該怎麼辦?如果我在代理的即將到來的回調函數中需要這個值,該怎麼辦? – Jin 2012-02-28 08:43:17

+1

你根本無法做到,而且你必須以某種方式解決它。見例如[這個問題和最佳答案](http://stackoverflow.com/questions/9474018/returning-uiimage-from-block)瞭解更多信息。 – ayoy 2012-02-28 08:49:30