0
__block int x = 5; 
dispatch_queue_t abe = dispatch_queue_create([[NSString stringWithFormat:@"abe'sQueue.%@", self] UTF8String], NULL); 
dispatch_sync(abe, ^{ 
    NSLog(@"%@", [self returnSomething]); 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     x = 20; 
    }); 
}); 

NSLog(@"%d", x); 

即使主线程的嵌套回调异步更改值,上面的总是会导致5是'x'的记录值。任何想法,我要去哪里错了?从调度队列主线程嵌套回调不工作?

回答

2

您正在异步调度到主队列。该块已排队,并且dispatch_async()立即返回。假设代码的其余部分在主线程上运行,那么异步入队的块将不会运行,直到下一次通过主事件循环时才会运行,直到上面的所有代码执行完毕才会发生。

为了以这种方式设置标量变量,没有理由对主线程调度dispatch_async()。直接设置变量(因为主线程在dispatch_sync()上被阻塞。

+0

感谢您的解释。一个快速后续问题:如果有多个这样的队列 - 并且从iOS开发库取得它们可以同时运行 - 我仍然需要包含嵌套的'dispatch_async'函数,因为肯定有些队列会运行在不同的线程上吗? – user1945991

+0

对于标量?除了处理“正常”并发问题外,不需要另外处理。对于非标量或采取操作可能会导致UI更新?是的 - 您可能需要重新发送回主队列。取决于情况。当然,任何时候您都可以异步执行任何操作,您必须处理如何协调价值变化。 – bbum