안녕하세요🐱 이번에는 GCD에 포함되어 있는 DispatchQue.main에 대해 다루어 보려고 합니다.

 

DispatchQueue.main는 메인 스레드에서 처리되는 Serial queue입니다. 모든 UI 작업이 여기서 수행해야 합니다.

 

sync, async

// 1
DispatchQueue.main.sync { 
	// code
}

// 2
DispatchQueue.main.async { 
	// code
}

먼저 sync는 동기, async는 비동기 실행이겠죠?

 

1) DispatchQueue.main.sync

작업이 다 끝날 때 까지 현재의 queue는 block되어 기다립니다.

 

DispatchQueue.main.sync는 메인 Thread에서 순차적으로 해당 코드를 실행해라! 라는 의미가 되지만 그냥 DispatchQueue.main.sync를 호출하면 Deadlock(교착 상태)에 걸려 앱이 강제종료가 됩니다.

DispatchQueue.main은 메인 스레드에서 전역적으로 사용 가능한 serial queue입니다. 앱의 실행에 있어서 끊임없이 앱의 이벤트를 처리하고 있습니다. 하지만 DispatchQueue.main.sync를 호출함으로써 끊임없는 앱의 이벤트 처리가 대기상태로 멈추게 되면서 모든 앱의 이벤트 처리가 멈추게되며 우리가 호출한 DispatchQueue.main.sync 마저도 멈추게 됩니다. 그렇기 때문에 꼭 필요한 상황에서만 사용해야 합니다. 

DispatchQueue.global().async {
	// UI가 변경되기 전에 실행
	DispatchQueue.main.sync { 
    	// UI 업데이트
    }
    // UI 변경 후 실행
}

가장 대표적인 상황은 위 코드처럼 백그라운드 스레드에서 비동기로 처리되는 도중에 UI업데이트를 기다렸다가 실행되어야 하는 상황입니다. 그 외에는 DispatchQueue.main.sync의 사용을 지양해야 합니다.

 

 

2) DispatchQueue.main.async

작업을 수행하자마자 현재의 queue에 컨트롤을 넘겨주고 작업이 끝나기 전까지 기다릴 필요가 없습니다.

 

 데이터를 로드하거나 특정 무거운 작업을 실행하게 될 때 어플리케이션의 UI는 느려지거나 멈추게 됩니다.  DispatchQueue.main.async는 클로저 안의 실행문을 작업을 대기열로 보내 비동기로 작업을 실행하여 동시에 2가지 이상의 task를 수행할 수 있도록 도와줍니다. 하지만 스레드에 안전하지 않기 때문에 서로 다른 스레드에서 동일한 변수를 변경, 사용하게 된다면 문제가 되니 주의해야 합니다!

반응형

+ Recent posts