ios - iOS-Grand Central Dispatch从dispatch_async中的 block 获取值(value)

标签 ios return-value grand-central-dispatch

我正在使用下面的代码从网上下载一些数据。我需要像以前一样保留数据吗?同样,来自该块内部的NSLog语句显示该数组已被填充,但是当我在该块外部运行NSLog时,该数组显示为(null)。如何将数据保存在dispatch_async方法之外?

    __block NSArray *downloadedCareerIds;
    __block NSArray *diskCareerIds;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        /* Download stuff */

        downloadedCareerIds = [[CareersParser idsFrom:@"web"] retain];
        diskCareerIds = [[CareersParser idsFrom:@"disk"] retain];

        DLog(@"downloadedCareerIds: %@", downloadedCareerIds);

        DLog(@"diskCareerIds: %@", diskCareerIds);

    });


    DLog(@"downloadedCareerIds: %@", downloadedCareerIds);

    DLog(@"diskCareerIds: %@", diskCareerIds);

最佳答案

dispatch_async是一种非阻塞方法,因此它将立即返回。因此,当调用块外部的DLog语句时,大多数情况下不会设置它们。因此,您看不到从内部日志语句中获得的值。

如果要对同一方法中的数据进行操作,则必须发送无意义的阻塞dispatch_sync或可以在块中调用这些方法。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    ....

    [self doStuffWithTheArrays];
});

一旦执行了该块,这些对象将是可用的,前提是它们是实例变量,否则您将丢失引用。

关于ios - iOS-Grand Central Dispatch从dispatch_async中的 block 获取值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6679707/

相关文章:

Bash:如何使用局部变量同时捕获错误和回显值?

ios - 通过 Grand Central Dispatch 实现堆的快速增长

macos - Grand Central Dispatch 与 Cilk++

ios - 使用 dispatch_sync 在 uicollectionview 上延迟加载

ios - 其他接口(interface)/设备的操作表

iphone - 键盘弹起时 Facebook 对话框不旋转

ios - pageViewController 中的内容转移

ios - 关联的枚举类型实现 CaseItratable

java - ArrayList.isEmpty() 时如何返回值?

c++ - CGAL:当三角形没有时来自邻居的输出