我正在使用下面的代码从网上下载一些数据。我需要像以前一样保留数据吗?同样,来自该块内部的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/