2014-09-17 4 views
4

dispatch_once에서 어떤 스레드가 실행됩니까? 주 스레드에서 코드를 실행하는 경우 dispatch_once 블록을 백그라운드 스레드에서 실행할 수 있습니까? 어떤 스레드가 실행하는지에 관계없이 주 스레드에서 실행되도록하려면 어떻게해야합니까?dispatch_once에서 어떤 스레드가 실행됩니까?

답변

5

현재/호출 스레드에서 실행됩니다. 원한다면 dispatch_sync을 사용하여 백그라운드 스레드에서 실행되도록 할 수 있다고 가정하지만 그게 무엇인지 알 수는 없습니다. 요컨대 현재 스레드에서 실행됩니다. 다른 스레드가 이미 dispatch_once 블록에있는 경우 호출 스레드는 블록이 다른 스레드에서 실행이 완료 될 때까지 차단 한 다음 계속 진행합니다.

+2

iOS 8/Yosemite에서 'dispatch_once'는 블록을 실제로 실행하는 스레드가 블록의 동일한'dispatch_once '에서 대기중인 다른 모든 스레드 중 가장 높은 QoS (~ 우선 순위)로 실행되는지 확인합니다 끝내기 위해. – das

+0

감사합니다. 주 스레드에서 실행되도록하려면 어떻게해야합니까? – Boon

+0

메인 스레드에서만이 API를 호출하는 것이 가장 좋은 방법이며,이 시점에서 더 이상 'dispatch_once'가 필요하지 않습니다. 이 권리를 얻을 수있는 다른 방법은 없습니다. 가장 명백한 문제는 다음과 같습니다 : BG 스레드가'dispatch_once'를 치면 주 스레드도 그것을 쳐냅니다. 메인 쓰레드는 BG 쓰레드가 블록을 빠져 나오기를 기다리지 만 BG 쓰레드는 블로킹되어 메인 쓰레드가 작업을 끝내고 돌아올 때까지 기다린다. 따라서 교착 상태. – ipmcc

관련 문제