2014-05-15 1 views
1

dispatch_async 호출에 대한 dispatch_async 호출과 dispatch_sync 호출에 대한 일반적인 관용을 보았습니다.dispatch_async에 대한 dispatch_async 호출과 dispatch_sync 호출에 대한 dispatch_async 호출

경우에 따라 후자를 전자로 대체 할 수 있습니다. 질문은 어떤 상황에서 하나만 사용할 수 있습니까? 당신이 dispatch_async 내부에 다른 코드가 있고 dispatch_sync 완료 내부 코드 뒤에 실행하는 코드를 원하는 경우

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // 
    }); 
}); 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    dispatch_sync(dispatch_get_main_queue(), ^{ 
     // 
    }); 
}); 

답변

1

제 2 옵션은 의미가 있습니다.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    // A) Some code here 

    dispatch_sync(dispatch_get_main_queue(), ^{ 
     // B) some code here 
    }); 

    // C) Some code here 
}); 

이렇게하면 A가 실행되고 B (주 스레드), C (백그라운드 스레드가 실행되지만 B 코드가 완료된 후)가 실행됩니다.

C 코드가없는 경우 동일한 내용의 내부 발송 결과에 dispatch_sync 또는 dispatch_async을 사용하십시오.

+0

C 코드가 없으면 논리적 인 효과가 동일하지만 실용적인 효과는 스레드를 점유했지만 아무것도하지 않는 것입니다. –

1

나는 스레드 차단을 피하기 위해 노력해야한다고 말하고 싶습니다. dispatch_sync()을 사용하려는 유혹에 빠져있는 경우 메인 스레드로 전송되는 코드가 완료된 후에 실행할 코드가 있기 때문에 "연속 전달"코딩 스타일을 사용해야합니다. 기본 대기열에 제출하는 태스크는 동시 대기열에 새 태스크를 제출해야합니다. 당신은 본질적으로 동기 인터페이스를 구현 할 때

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    // A) Some code here 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // B) some code here 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      // C) Some code here 
     }); 
    }); 
}); 

dispatch_sync()를 사용하는 주된 이유는 그러나 당신은 그것을 달성하기 위해 큐에 작업을 파견 할 필요가 : 그래서, 코드처럼 보일 수 있습니다. 이것은 대개 직렬 디스패치 대기열 (또는 동시 대기열의 배리어 작업)을 사용하여 공유 자원을 보호하는 경우에만 발생합니다.

원래 코드에 이미 dispatch_async() 호출이있는 경우 동기식 인터페이스를 구현할 수 없습니다.