我对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];
答案 0 :(得分:3)
由于ALAssetsLibrary documentation状态,enumerateGroupsWithTypes:usingBlock:failureBlock:
是异步的,因此不会被调用到位,而是计划在下一个运行循环周期内调用它。文件清楚地说明了原因是什么,以及如何继续:
此方法是异步的。枚举组时,可能会要求用户确认应用程序对数据的访问权限;但是,该方法立即返回。您应该使用 enumerationBlock 中的资产执行您想要的任何工作。