块的执行总是延迟

Posted

技术标签:

【中文标题】块的执行总是延迟【英文标题】:The execution of block is always delayed 【发布时间】:2012-03-17 17:15:33 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

谢谢,ayoy!如果我需要在enumerationBlock中返回一个值,我该怎么办?如果我在即将到来的委托回调函数中需要该值该怎么办? 你根本做不到,你必须以某种方式解决它。参见例如this question and top answer 了解更多信息。

以上是关于块的执行总是延迟的主要内容,如果未能解决你的问题,请参考以下文章

如何延迟 dispatch_after 排队的块的执行? [复制]

带有块的 Objective-C 延迟动作

Angular 6 - 指定延迟加载块的路径

LINQ 学习路程 -- 查询操作 Deferred Execution of LINQ Query 延迟执行

iOS: 零误差或极小误差的定时执行或延迟执行?

JAVA中 如何使用延迟?