IOS application/Networking

5. DispatchQueue는 어떻게 사용할까?

개발자킹콩 2021. 4. 16. 01:42

DispatchQueue는 어떻게 사용할까?

 

DispatchQueue는 어떻게 사용할까?

https://medium.com/nbt-tech/dispatchqueue%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C-44f22f08d62

 

DispatchQueue는 어떻게 사용할까?

안녕하세요. 오늘은 iOS Dispatch Queue를 어떤 상황에 사용해야 하는지 알아보려합니다. Dispatch Queue를 이용하면 많은 이점이 있다는 것은 알고 있지만, 정작 사용된 모습을 찾아보기는 힘들었습니다

medium.com

 

해당 게시판의 글을 참고하여 정리하였다.

 

 

 


 

 

 

 

 

GCD (Grand Central Dispatch)

 

GCD는 Apple에서 만든 멀티 코어 환경에서의 Application을 개발할때 도움을 주는 라이브러리이다.

Task라는 작업을 대기열을 주어 순서대로 실행을 시키거나, 작업을 동시에 실행 시켜주는 등 많은 작업을 할 수 있게 도와준다.

 

GCD를 쓰면 Implicit Threading 기법처럼 시스템의 Thread Pool이라는 곳에서 Thread는 알아서 할당하기에 개발자가 Thread를 다룰 때 관리할 일이 많이 줄어들어 편하게 사용할 수 있다.

GCD는 모든 Task를 FIFO(First-in First-out)인 Queue로 관리하며, 시스템에 의해 관리되는 pool이 queue들을 실행한다. 그래서 개발자가 thread를 관리하는 일이 없어지게 되는 것이다.

 

 

 

 

 

그렇다면 GCD는 멀티 코어 환경을 위함이라고 했는데 어떤 상황에 쓰여지는 것일까?

바로 Synchronously(동기) & Asychronously(비동기) 한 상황에 쓰여지게 된다.

 

동기는 하나의 Task가 끝난 다음에 다음 Task를 수행하는 것이고,

비동기는 동기적이기 않은 것이고 하나의 작업이 끝나기 전에 다음 작업을 수행할 수 있는 것이다.

 

 

동기적으로 실행하게 되면 오래걸리는 작업을 수행할 때 빠르게 수행되어야 할 작업은 기다려야 하기에 불필요한 시간 낭비가 발생하게 된다. 그래서 비동기에서 실행하는 방식이 생겼다. 어떤 Task가 실행되어도 다른 Thread에서 이전에 실행되었던 Task가 끝날때 까지 기다리지 않고 독립적으로 새롭게 실행 할 수 있게 된다.

하지만 FIFO구조에서의 Queue는 내가 제출한 Task의 순서대로 실행되고 끝나는걸 보장 할 수 없다.

이미 있는 Task가 끝난 다음 Task가 시작되는게 아니라 Task가 시작이 되면 다음것을 실행하기 때문이다.

 

여기서 중요한 점은 그렇다고 비동기가 Concurrency 의미는 아니라는 것이다.

비동기 Task를 Serial queue 혹은 Concurrent queue중 어디에 submit하는가에 따라 달라지게 된다.

 

 

 

 

 


 

 

 

 

Main Queue

 

MainQueue는 IOS에서 UI업데이트를 담당하고 있는 Thread이다.

UI업데이트가 아닌 다른 코드들을 실행하면 UI Freezing가 발생하곤 한다. 주의하자

 

 

 

 

Dispatch Queue

 

IOS에서 여러 Thread를 가지고 작업을 하기 위해서는 DispatchQueue를 사용해야한다.(다른 방법도 존재)

IOS에서 Queue를 만들면 자동으로 하나 혹은 그 이상의 Thread에 내가 만든 queue를 배정해 준다.

만약에 사용가능한 thread가 있다면 다시 재사용 할 것이고, 아니면 OS에 필요에 따라 Thread를 생성하기도 한다. 

시스템에 존재하는 Thread Pool에서 Thread의 할당을 관리 받기에 사용자가 thread를 직접 관리할 필요가 없으니 GCD를 사용한다.

 

 

 

 

 

QoS (Quality of service) —>  queue의 priority의 정보를 담고있는 클래스

 

이제 손쉽게 queue를 만들엇으니 각 queue의 우선순위를 보여주도록 하겠다.

 

 

.userInteractive

제일 높은 우선순위입니다. 유저에게 직접적으로 반응을 보여줘야 할때 사용하게되죠. UI업데이트나 애니메이션작업에 사용하게 됩니다.

 

.userInitiated

유저의 UI입력으로 시작되며, 거의 바로 결과를 보여줘야 할때 사용합니다. 하지만 작업이 비동기적으로 끝 맞칠 수 있습니다. 예를 들면 로컬에 저장되어있는 문서를 불러올때, 유저는 클릭 후 거의 바로 결과를 얻길 기대할때 말이죠.

 

.utility
자 이게 바로 우리가 사용하길 원했던 QoS인 것 같은데요. 네트워크나, 긴 실행 시간을 가졌을때 사용되는 우선순위입니다. 

첨부파일을 업로드하고 결과를 받아 처리하는건 이것을 사용하면 될 것 같네요. 

OS는 적절한 응답성, 혹은 성능을 높여 에너지를 많이 쓰게 하는지를 스스로 정해서 사용합니다.

 

.background
직접적으로 보여지지 않아도 될때 사용하면 됩니다. OS는 속도보다는 에너지 효율에 초점을 맞춰 작업을 진행하게 될꺼구요.

 

.default, .unspecified
두가지 선택지가있지만 직접 사용하지는 않은 옵션입니다. default옵션은 userInitiated와 utility의 중간 정도라고 보시면 됩니다.

 

 

 

 

 

'IOS application > Networking' 카테고리의 다른 글

7. URLSession 개념  (0) 2021.04.18
6. GCD 실습  (0) 2021.04.17
4. GCD (Grand Central Dispatch)  (0) 2021.04.15
3. Concurrency (동시성)  (0) 2021.04.14
2. 네트워킹 하는 것을 확인할 수 있는 툴  (0) 2021.04.12