【发布时间】:2020-05-13 13:37:35
【问题描述】:
我有一个带有多个线程的 iOS 应用。在后台线程中,我运行了一些第 3 方代码。 3rd 方代码偶尔会调用:
dispatch_sync(dispatch_get_main_queue(), block);
回调必须是 _sync,因为它需要应答并且需要在主线程上,因为它调用了UIApplication。
当我需要关闭后台线程时出现问题。关闭源于 UI,它也必须是同步的。所以,我有时会看到死锁。
我已经尝试通过here 描述的方法解决它。基本上在循环中调用 NSRunLoop,直到后台线程设置了一个标志。 像这样:
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
但是,它不起作用。我可以在调试器中看到后台线程挂在 dispatch_sync 调用上,即使 NSRunLoop runUntilDate 被多次调用。
这里是后台线程的调用栈,被阻塞了:
这里是主线程的调用栈(它没有崩溃,只是在调试器中暂停):
我认为这一定与运行模式有关,但我不确定是什么以及如何解决这个问题。 那么,当主线程忙于循环时,如何为 GCD 主队列提供服务呢?
【问题讨论】:
-
只是为了澄清:“关闭源自 UI,它也必须是异步的”可能应该是“......它也必须是 sync”?
-
确实是@Tommy。谢谢你抓住那个。我已经编辑了问题。
标签: ios multithreading grand-central-dispatch deadlock nsrunloop