我需要在主队列上同步地分派一个block。我不知道当前是否正在主线程上运行。幼稚的解决方案如下:
dispatch_sync(dispatch_get_main_queue(), block);
但是,如果我当前正在主队列上运行的块中,这个调用会创建一个死锁。(同步调度等待该块完成,但该块甚至没有开始运行,因为我们正在等待当前的块完成。)
显然的下一步是检查当前队列:
if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
block();
} else {
dispatch_sync(dispatch_get_main_queue(), block);
}
这个代码是能够工作的,但是它很丑陋。在我将其隐藏到一些自定义函数之前,难道没有更好的解决方案吗?我强调我无法异步地分派块 - 应用程序处于异步分派的块会被“太迟”执行的情况下。