2

我对IOS很陌生。我想获取设备上的所有图片viewDidLoadNSLog(@"%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];
4

1 回答 1

3

正如ALAssetsLibrary 文档所述,enumerateGroupsWithTypes:usingBlock:failureBlock:它是异步的,因此不是就地调用,而是计划在下一个运行循环周期内调用。该文档清楚地说明了这是什么原因以及您应该如何进行:

此方法是异步的。枚举组时,可能会要求用户确认应用程序对数据的访问;但是,该方法会立即返回。您应该对enumerationBlock中的资产执行任何您想要的工作。

于 2012-02-28T08:27:58.583 回答