我需要在主队列上同步分配一个区块.我不知道我当前是否在主线程上运行.简单的解决方案如下所示:
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);
}
这很管用,但很难看.在我至少把它隐藏在一些自定义函数后面之前,这个问题难道没有更好的解决方案吗?我要强调的是,我负担不起异步调度块的费用——应用程序处于异步调度的块执行"太晚"的情况下.