Swift: DispatchQueue

나이든별 / Oldstar·2022년 1월 8일
0

Swift / iOS Keywords

목록 보기
6/13

참조 : Concurrency by Tutorials (https://www.raywenderlich.com/books/concurrency-by-tutorials)
참조 : https://stackoverflow.com/questions/19179358/concurrent-vs-serial-queues-in-gcd/53582047

  • 먼저 DispatchQueue는 GCD(Grand Central Dispatch)와 관련이 있다.
  • queue에는 serial과 concurrent의 두 가지가 있는데, 전자는 순서대로 하나씩 작업을, 후자는 동시에 여러 작업을 하는 큐이다. 다만, concurrent queue도 어쨌든 큐기 때문에 입력받은 순서대로 태스크를 하기 시작하기는 한다. 아무튼 DispatchQueue도 상기한 두 가지가 있다.
  • Cocoa에서 제공하는 두 가지 기본 큐는 main과 global이 있다.
  • main dispatch queue는 앱의 메인 쓰레드에서 태스크를 수행하는 serial queue이다. 이런 이유 때문인지, main.sync는 데드락을 일으킨다. main은 타입 파라미터이다.
  • global dispatch queue는 concurrent queue이다. global은 파라미터로 중요도 변수를 받는다.
  • 정확히는 DispatchQoS.QoSClass라는 열거형. QoS는 Quality of Service로, 상술했듯 태스크의 중요도를 나타낸다. .userInteractive, .userInitiated, .utility, .background의 네 가지를 주로 사용하며, 앞에 있을수록 중요한 동작, 즉 빠르게 수행되어야 하는 동작이다. 한편 .default나 .unspecified도 호환성을 위해 존재한다.
  • QoS를 알맞게 지정해주면 앱의 에너지 효율이 좋아진다는 것을 알아두자.
  • 나만의 큐를 만들고자 할 때, DispatchQueue 안의 attributes 파라미터에 .concurrent를 넣어줘야 concurrent queue를 만들 수 있다.
  • sync, async는 각각 동기적, 비동기적 처리를 말한다. "같은 큐 안에 들어있는 작업에 한해서" 전자는 큐에 작업을 추가하고 그게 끝날 때까지 기다리는 거고, 후자는 일단 큐에 작업은 추가하되 다른 작업도 수행하는 그런 거다.
  • main.sync에 대해 첨언하자면, ui 이벤트는 무조건 메인 큐에서 실행되어야 하는데, 우리가 거기에 태스크를 집어넣어 버리면 일단 큐를 잠그고 해당 태스크가 완료될 때까지 기다린다. 근데 큐가 잠겼는데 태스크가 완료될 턱이 있나.. 그래서 데드락이 걸리는 것이다. 다만, 백그라운드 스레드에서 정해진 순서에 맞게 ui가 업데이트되게끔 만들 때 사용할 수 있다.
  • DispatchQueue.main.async는 그래서, ui 관련 동작을 수행할 때 사용된다.
  • ui와 관련이 없는, 데이터를 불러온다던지 하는 무거운 작업은 메인 큐 대신 다른 큐에서 돌리는 게 바람직하다. 그래야 ui가 계속 유저 액션을 받을 수 있기 때문. ui 업데이트를 다른 큐에서 하게 되면 예상과는 다른 타이밍/속도로 반영될 우려가 있다.
  • sync는 그래서, 작업이 끝날 때까지 기다려야 할 때 쓰게 된다.
profile
함께 나아가고자 하는 사람

0개의 댓글