Swift의 Mac 명령 줄 도구에서 DispatchQueue.main.async를 사용할 때 실행 루프가 필요한 이유는 무엇입니까?
메인 디스패치 대기열에서 작업을 구현하기 위해 런 루프를 사용해야하는 이유를 이해하기 위해 Apple의 문서를 찾았습니다.
Apple 문서 에 따르면 ,
기본 디스패치 대기열은 응용 프로그램의 기본 스레드에서 작업을 실행하는 전역 적으로 사용 가능한 직렬 대기열입니다. 이 큐는 애플리케이션의 실행 루프 (있는 경우) 와 함께 작동하여 대기중인 작업의 실행과 실행 루프에 연결된 다른 이벤트 소스의 실행을 인터리브합니다. 애플리케이션의 메인 스레드에서 실행되기 때문에 메인 큐는 애플리케이션의 키 동기화 지점으로 자주 사용됩니다.
하지만 여전히 '왜'런 루프가 필요한지 이해할 수 없습니다. 그것은 '실행 루프가 필요하기 때문에 실행 루프가 필요합니다'처럼 들립니다. 누군가가 이것에 대해 설명 해주면 매우 감사하겠습니다. 감사합니다.
답변
메인 디스패치 큐에서 작업을 구현하기 위해 런 루프를 사용해야하는 이유
일반적으로 이미 사용하고 있기 때문에 그렇지 않습니다!
애플리케이션 프로젝트에는 이미 메인 큐 실행 루프 가 있습니다. 예를 들어 iOS 앱 프로젝트는 실제로 실행 루프를 제공하는 UIApplicationMain에 대한 거대한 호출에 불과합니다.
그것이 사용자가 무언가를하기를 기다리면서 거기 앉아있을 수있는 방법입니다. 실행 루프는, 어, 실행 중입니다. 그리고 반복.
그러나 예를 들어 Mac 명령 줄 도구에는 자동 실행 루프가 없습니다. 주 기능을 실행하고 즉시 종료됩니다. 그렇게하지 않으려면 실행 루프를 제공합니다.
DispatchQueue.main.async
백그라운드 큐에서 실행되는 코드가 있고 메인 큐에서 실행될 특정 코드 블록이 필요한 경우입니다.귀하의 코드
viewDidLoad
에서은 이미 기본 대기열에서 실행 중이므로 DispatchQueue.main.async를 사용할 이유가 거의 없습니다.그러나 그것을 사용하는 것이 반드시 잘못된 것은 아닙니다. 그러나 실행 순서를 변경합니다.
비동기 클로저는 현재 런 루프가 완료된 후 실행되도록 대기열에 추가됩니다.
'왜'런 루프가 필요한지 이해할 수 없습니다.
일반적으로 명령 줄 앱에는 실행 루프가 필요하지 않습니다. 특별한 필요가있는 경우 (예 : 사용자 입력을 기다리는 동안 일부 작업을 수행하는 일부 동적 UI가있는 경우) 실행 루프를 사용할 수 있지만 대부분의 명령 줄 앱에는 실행 루프가 필요하지 않습니다.
으로 워드 프로세서는 말한다 :
실행 루프는 작업을 예약하고 수신 이벤트 수신을 조정하는 데 사용하는 이벤트 처리 루프입니다. 실행 루프의 목적은 할 작업이있을 때 스레드를 바쁘게 유지하고 작업이 없을 때 스레드를 절전 모드로 전환하는 것입니다.
따라서 앱이 일부 수신 이벤트를 기다려야하거나 대기열간에 비동기식으로 작업을 전달해야하는 경우 실행 루프를 사용하지만 그렇지 않으면 신경 쓰지 마십시오. 대부분의 명령 줄 앱은 실행 루프를 전혀 사용할 필요가 없습니다.