我需要在主队列上同步调度一个块。我不知道我当前是否在主线程上运行。天真的解决方案如下所示:
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);
}
这有效,但它很丑。在我至少将它隐藏在一些自定义函数后面之前,对于这个问题没有更好的解决方案吗?我强调我不能异步调度块——应用程序处于异步调度块将“太晚”执行的情况。