dispatch_once块运行在哪个线程?如果代码是从主线程运行的,dispatch_once块可以在后台线程运行吗?我该如何确保它在主线程上执行,无论哪个线程执行它?
dispatch_once块运行在哪个线程?如果代码是从主线程运行的,dispatch_once块可以在后台线程运行吗?我该如何确保它在主线程上执行,无论哪个线程执行它?
该方法在当前/调用线程中运行。如果您想要,我想您可以使用dispatch_sync
确保它在后台线程上运行,但我不确定这样做会有什么好处。总之,它在当前线程中运行。如果另一个线程已经在dispatch_once
块中,则调用线程将被阻塞,直到该块在另一个线程上执行完毕,然后继续执行。
dispatch_once
还将确保执行块的线程在等待块完成的所有其他线程中以最高QoS(~优先级)运行。 - dasdispatch_once
。实际上没有其他方法可以做到这一点。最明显的问题看起来像这样:您的BG线程触发了dispatch_once
,然后主线程也触发了它;主线程将被阻塞等待BG线程退出该块,但是BG线程将被阻塞等待主线程完成工作并返回。因此死锁。 - ipmccdispatch_sync
不会改变线程。你应该使用dispatch_async
来改变线程。 - Enricoza