gpt4 book ai didi

objective-c - 如何在没有死锁的情况下同步调度主队列?

转载 作者:IT老高 更新时间:2023-10-28 11:28:47 25 4
gpt4 key购买 nike

我需要在主队列上同步调度一个 block 。我不知道我当前是否在主线程上运行。天真的解决方案如下所示:

dispatch_sync(dispatch_get_main_queue(), block);

但如果我当前位于主队列上运行的 block 内,则此调用会造成死锁。 (同步调度等待 block 完成,但 block 甚至没有开始运行,因为我们正在等待当前的完成。)

下一步显然是检查当前队列:

if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
block();
} else {
dispatch_sync(dispatch_get_main_queue(), block);
}

这可行,但很难看。在我至少把它隐藏在一些自定义函数后面之前,这个问题没有更好的解决方案吗?我强调我不能异步调度 block ——应用程序处于异步调度 block 将“太迟”执行的情况。

最佳答案

我需要在我的 Mac 和 iOS 应用程序中经常使用类似的东西,所以我使用了以下帮助函数(最初在 this answer 中描述):

void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
if ([NSThread isMainThread])
{
block();
}
else
{
dispatch_sync(dispatch_get_main_queue(), block);
}
}

你通过它调用

runOnMainQueueWithoutDeadlocking(^{
//Do stuff
});

这几乎就是您在上面描述的过程,我已经与其他几位为自己独立制作过类似东西的开发人员进行了交谈。

我使用 [NSThread isMainThread] 而不是检查 dispatch_get_current_queue(),因为 caveats section for that function曾经警告不要将其用于身份测试和the call was deprecated in iOS 6 .

关于objective-c - 如何在没有死锁的情况下同步调度主队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10330679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com