Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 块的执行总是延迟的_Ios_Objective C Blocks_Assetslibrary - Fatal编程技术网

Ios 块的执行总是延迟的

Ios 块的执行总是延迟的,ios,objective-c-blocks,assetslibrary,Ios,Objective C Blocks,Assetslibrary,我对IOS很陌生。我想在viewDidLoad中获取设备上的所有图片。但是块总是在我调用代码中的NSLog(@“%d”,photos.count)之后执行,如下所示。如何处理这类案件 __block NSMutableArray* photos = [[[NSMutableArray alloc] init] retain]; ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; void (^assertsEnumerator

我对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];
如前所述,
enumerateGroupsWithTypes:usingBlock:failureBlock:
是异步的,因此它不是就地调用,而是计划在下一个运行循环周期内调用。文件中明确说明了原因以及应如何进行:

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


谢谢你,哎哟!如果我需要在enumerationBlock中返回一个值,我应该怎么做?如果我在即将到来的delegate回调函数中需要这个值,我该怎么办?你根本做不到,你必须设法解决它。有关更多信息,请参见例如。