块的执行总是延迟

我对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]; 

正如ALAssetsLibrary文档所述, enumerateGroupsWithTypes:usingBlock:failureBlock:是asynchronous的,所以不是调用适当的地方,而是调度从下一个运行循环中调用。 该文件明确指出了什么原因,你应该如何进行:

这种方法是asynchronous的。 当枚举组时,用户可能会被要求确认应用程序访问数据; 该方法,但是,立即返回。 您应该使用enumerationBlock中的资源执行任何您想要的工作。