관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] DispatchQueue.main.async와 DispatchQueue.main.sync 스레드 동작 이해하기 본문

iOS 응용 (swift)

[iOS - swift] DispatchQueue.main.async와 DispatchQueue.main.sync 스레드 동작 이해하기

jake-kim 2023. 9. 28. 01:58

DispatchQueue 개념

  • 대학 전공서로 대표적으로 많이 쓰는 OS 공룡책에 의하면, apple은 스레드 풀을 DispatchQueue라는 곳에서 관리하도록 하여 개발자는 스레드 관리에 많은 신경을 쓰지 않고 사용이 가능
  • DispatchQueue를 사용하면 Thread Safe하게 스레드 풀을 알아서 관리
  • main 관련 스레드를 관리해주는 것들은 DispatchQueue.main으로 사용
  • background 관련 스레드를 관리해주는 것들은 DispatchQueue.global(), DispatchQueue()으로 사용

Async, sync 개념

  • async: 앞전에 있던 task들이 끝나는 것을 기다리지 않고 새로운 task를 처리
  • sync: 앞전에 있던 task들이 끝난 후에 새로운 task 처리

ex) A -> B -> C -> D 순서대로 작업 Queue에 넣고 일을 수행

  • async: 일 완료 순서가 매번 다름
  • sync: 일 완료 순서가 항상 같음  A -> B -> C -> D

DispatchQueue.main.async와 DispatchQueue.main.sync 개념

  • async는 main 내부에서의 일들을 의하는게 아니고, 현재 스레드를 async로 처리한다는 의미이기 때문에 현재 스레드의 특정 작업이 끝나는 것을 기다리지 않고 async로 들어오는 {} 부분을 수행한다는 의미
  • sync는 현재 스레드를 sync로 처리한다는 의미이며, 현재 스레드를 잠시 block하고 {}로 들어온 일을 수행한다는 의미

ex) 이미 main thread인 상황에서 DispatchQueue.main.sync를 사용하면 deadlock이 걸리는 현상

  • sync로 동작하면, 현재 스레드 (main thread)를 차단하고, 새로운 task를 수행하려고 하는데 이것도 main thread라서 수행하지 못하는 상황이 발생

 

* 참고

https://www.yes24.com/Product/Goods/78225791

Comments