dispatch_once中的代码在哪个线程运行?

4

dispatch_once块运行在哪个线程?如果代码是从主线程运行的,dispatch_once块可以在后台线程运行吗?我该如何确保它在主线程上执行,无论哪个线程执行它?

1个回答

6

该方法在当前/调用线程中运行。如果您想要,我想您可以使用dispatch_sync确保它在后台线程上运行,但我不确定这样做会有什么好处。总之,它在当前线程中运行。如果另一个线程已经在dispatch_once块中,则调用线程将被阻塞,直到该块在另一个线程上执行完毕,然后继续执行。


2
从iOS 8 / Yosemite开始,dispatch_once还将确保执行块的线程在等待块完成的所有其他线程中以最高QoS(~优先级)运行。 - das
确保这一点的最佳方法是仅从主线程调用此API,此时您不再需要dispatch_once。实际上没有其他方法可以做到这一点。最明显的问题看起来像这样:您的BG线程触发了dispatch_once,然后主线程也触发了它;主线程将被阻塞等待BG线程退出该块,但是BG线程将被阻塞等待主线程完成工作并返回。因此死锁。 - ipmcc
实际上,dispatch_sync 不会改变线程。你应该使用 dispatch_async 来改变线程。 - Enricoza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接