2014-05-11 1 views
4

SDWebImage은 SDWebImageManager의 이미지 다운로드 코드에 다음 코드를 사용합니다. 스레드가 관계없이 dispatch_sync를 수행하는 대신 주 스레드인지 확인해야하는 이유는 무엇입니까? 블록 즉시 교착 현재 직렬 큐 결과 동기 급전dispatch_sync 전에 스레드가 주 스레드인지 확인해야하는 이유는 무엇입니까?

#define dispatch_main_sync_safe(block)\ 
    if ([NSThread isMainThread])\ 
    {\ 
     block();\ 
    }\ 
    else\ 
    {\ 
     dispatch_sync(dispatch_get_main_queue(), block);\ 
    } 
+0

아마도 그렇지 않습니다. – matt

+0

@matt는 동기화 호출이기 때문에 중요합니다. Martin이 지적한 것처럼 메인 쓰레드에서 메인 쓰레드로'dispatch_sync'를하면 앱은 교착 상태가됩니다! – Rob

+0

@ Rob 나는 그 생각을했지만 그때 그런 식으로 일어날 것이라고 믿을 수가 없었습니다 ... – matt

답변

4

. 코드가 메인 쓰레드 에서 호출 여부 될 경우 사전에 모르는 경우,

NSLog(@"before"); 
dispatch_sync(dispatch_get_main_queue(), ^{ 
    NSLog(@"in block"); 
}); 
NSLog(@"after"); 

따라서 그것을 : 당신은 메인 스레드/큐에 다음 코드를 실행하여 쉽게 것을 확인할 수 있습니다 if ([NSThread isMainThread])을 확인하는 것이 좋습니다. "주 스레드"와 "주 큐"는 실제로 동일합니다.

dispatch_async()을 사용하면 문제가 발생하지 않습니다.

+0

왜 SDWebImage가 dispatch_async 대신 dispatch_sync를 사용하는지 설명해 주시겠습니까? – keywind