我尝试在后台线程中进行网络通话,因此在等待时我不会冻结我的应用。
当我这样做时,电话会发生:
nextTime = [myObj getNextTime];
我得到它后立即做一个NSLog,那个有效。 但是,当我在调度块之外时,同样如此 NSLog打印出null。
myObj *current = ((myObj *)sortedArray[i]);
__block NSString *nextTime;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
nextTime = [myObj getNextTime];
NSLog(@"inside%@",nextTime);
dispatch_sync(dispatch_get_main_queue(), ^{
});
});
NSLog(@"outside%@",nextTime);
为什么外部日志打印为空?我做错了什么,我错过了吗?谢谢!
答案 0 :(得分:4)
那是因为你在异步块中设置它,并且异步块立即返回。如果查看两个日志的时间戳,您将看到外部日志实际上在内部日志和变量设置之前发布。
来自dispatch_async()
上的GCD docs:
此功能是将块提交给a的基本机制 调度队列。调用此函数后总是立即返回 块已提交,永远不会等待块 调用。目标队列确定是否调用该块 与提交的其他块相关或同时发生的 同一个队列。独立的串行队列同时处理 相对于彼此。
答案 1 :(得分:2)
您的“外部”NSLog
语句实际上应该放在设置为在主线程上运行的内部dispatch_async
块中,因为该块将在您设置{{{ 1}}。您放置在异步块调用之下的任何代码都可能在块内代码之前执行。