야곱은 같은 것처럼 보일 수 있지만 다른 것들을 지적합니다. 사실 메인 스레드에서 이미 실행중인 경우 주 스레드로 작업을 보내는 방식에 상당한 차이가 있습니다.
나는 최근에이 문제에 시달렸는데, 때로는 메인 스레드의 어떤 것으로부터 가끔씩 실행되는 일반적인 방법이있다. 특정 UI 업데이트를 보호하기 위해 아무런 문제없이 -performSelectorOnMainThread:
을 사용했습니다.
주 큐에서 dispatch_sync
을 사용하도록 전환하면이 메서드가 주 큐에서 실행될 때마다 응용 프로그램이 교착 상태가됩니다. dispatch_sync
에 설명서를 읽고, 우리는 다음을 참조하십시오
이 함수를 호출하고 교착 상태에 현재 큐 결과를 대상으로. -performSelectorOnMainThread:
위해 우리
는 지정
부울 기다리
여부 지정된 셀렉터 메인 쓰레드에 수신기에서 수행 된 후까지 현재 스레드 블록 . 이 스레드를 차단하려면 YES를 지정하십시오. 그렇지 않으면 은 NO를 지정하여이 메소드가 즉시 을 리턴하도록합니다.
현재 스레드가 기본 스레드이기도하고이 매개 변수에 대해 YES를 지정하면 메시지는 으로 전달되고 즉시 처리됩니다.
난 아직도 GCD의 우아함을 선호하는, 더 나은 컴파일 시간 검사는 제공 등 인수, 대한의 유연성은, 그래서 교착 상태 방지하기 위해이 작은 도우미 함수 만든 :
void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
if ([NSThread isMainThread])
{
block();
}
else
{
dispatch_sync(dispatch_get_main_queue(), block);
}
}
을
업데이트 : Dave Dribin이 caveats section ondispatch_get_current_queue()
을 지적함에 따라 위 코드에서 [NSThread isMainThread]
으로 변경했습니다.
나는 다음 원래 방법에 실행 된 스레드 것에 대해 걱정하지 않고, 내가 주 스레드에서 보안을 필요로하는 작업을 수행 할 수
runOnMainQueueWithoutDeadlocking(^{
//Do stuff
});
를 사용합니다.
withObject : YES는 작동하지 않으며 최소한 경고를 제공해야합니다. 이것은 수신기에 임의의 인수를 보낼 수있는 GDC의 장점 중 하나입니다. – FelixLam
그래, NSNumber에 포장해야 겠어. 하지만, 그 부분을 무시하고, 다른 것은 다른 것입니까? 그래도 좋은 지적이다. – akaru