在调度块中分配的变量返回null

时间:2014-02-13 19:09:45

标签: ios iphone objective-c multithreading grand-central-dispatch

我尝试在后台线程中进行网络通话,因此在等待时我不会冻结我的应用。

当我这样做时,电话会发生:

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);

为什么外部日志打印为空?我做错了什么,我错过了吗?谢谢!

2 个答案:

答案 0 :(得分:4)

那是因为你在异步块中设置它,并且异步块立即返回。如果查看两个日志的时间戳,您将看到外部日志实际上在内部日志和变量设置之前发布。

来自dispatch_async()上的GCD docs

  

此功能是将块提交给a的基本机制   调度队列。调用此函数后总是立即返回   块已提交,永远不会等待块   调用。目标队列确定是否调用该块   与提交的其他块相关或同时发生的   同一个队列。独立的串行队列同时处理   相对于彼此。

答案 1 :(得分:2)

您的“外部”NSLog语句实际上应该放在设置为在主线程上运行的内部dispatch_async块中,因为该块将在您设置{{{ 1}}。您放置在异步块调用之下的任何代码都可能在块内代码之前执行。