-
DispatchQueueiOS 2020. 8. 11. 23:22728x90
iOS의 쓰레드 스케줄링을 처리해줄 DispatchQueue 대해 공부해보겠습니다 :)
DispatchQueue
공식 문서의 설명을 간단하게 살펴볼까요?
An object that manages the execution of tasks serially or concurrently on your app's main thread or on a background thread.
앱의 메인쓰레드 또는 백그라운드 쓰레드에서 작업의 순차적(serially) 혹은 병렬적(concurrently) 처리를 관리하는 Object
네 설명 끝입니다. 역시 공식문서 답게 완벽한 요약이네요 👏하지만 이대로 끝낼 순 없으니 이제 이 말 뜻을 조금 더 풀어서 알아보겠습니다 :)
다시한번 DispatchQueue란 iOS의 thread 스케줄링을 관리하는 Object로 FIFO 방식의 Queue 입니다.
DispatchQueue는 2개의 기준으로 4개의 짝을 지어줄 수 있습니다.먼저 기준 2개를 살펴보겠습니다.
음... 제가 멋대로 붙여 본 설명인데 감안하고 봐주세요 😅1. 작업 방식: serially(순차적) vs concurrently(동시적 or 병렬적)
2. 처리 방식: sync(기다림) vs async(즉시)아무튼 이 기준에 따라 총 4개의 쌍이 나올 수 있습니다.
- serially + sync
- serially + async
- concurrently + sync
- concurrently + asyncSerially vs Concurrently
저는 이 둘을 작업 방식에 대한 의미로 해석했습니다. 라면 끓이는 과정을 예로 들어볼게요.
라면 끓이는 과정을 serially하게 처리해보면, 이렇게 할 수 있습니다.
1. 냄비에 물을 붓는다. (1분)
2. 물을 끓인다. (5분)
3. 물이 끓으면 라면과 스프를 넣고 더 끓인다. (2분)
4. 젓가락과 그릇을 꺼낸다. (1분)
5. 김치를 꺼낸다. (1분)이렇게 하면 도합 10분이 걸쳐서 라면을 끓여서 먹을 수 있습니다.
하지만 이렇게 하면 속터지시는 분들 계실거에요. concurrently 하게 처리해봅시다.
1. 냄비에 물을 붓고 라면과 스프를 넣는다. (1분)
2. 물을 끓인다. (5분)
2-1. 물이 끓는동안 젓가락과 그릇, 김치를 꺼낸다.이렇게하면 6분만에 라면을 먹을 수 있습니다. 🎉
네 우스운 예를 하나 들어봤지만,
이런 식으로 일을 하나씩 처리하는 걸 serially 라고 하고 main thread가 바로 serial queue 입니다.
따라서 데이터를 다운받는 일 같은 걸 메인쓰레드에서 해주면 다운이 다 될때까지 다른 일은 못하고 멈춰있게 됩니다.이와 달리 여러 작업을 동시에 해주는 걸 concurrently 라고 하고 global queue 가 concurrent queue 입니다.
globla queue는 우선순위에 따라 (high, default, low, background) 4개가 존재합니다.
우선순위를 Qos(Quality of Service) 라고 하는데 이것도
User-interactive, User-initiated, Utility, Background 4개로 분류됩니다.작업 방식을 하나씩 처리하도록 할지, 동시에 처리하도록 할지 ==> main vs global
sync vs async
한국어로 번역하는 과정에서 좀 비슷하게 보여서 많이 헷갈려하시는 부분입니다. 하지만 앞서 말씀드린 하나씩 처리할건지, 동시에 처리할건지와는 전혀 다른 개념입니다!!
sync는 앞의 작업이 끝날 때까지 기다렸다가 일을 하겠다는 의미이고,
async는 앞의 작업이 끝나던 안 끝나던 그동안 다른 일을 하겠다는 의미입니다.
앞서 라면 끓이는 과정에서 serial 방식으로 끓이든, concurrent 방식으로 끓이든,
하나의 작업이 끝날 때까지 아무것도 하지 않고 기다린다면 sync
물이 끓는 동안 책을 보거나 핸드폰을 하거나 다른 일을 한다면 async 입니다.
여기까지 읽어주셨다면 이제 동기와 비동기, 시리얼과 콘커런트(?) 는 헷갈리지 않으실거라 생각해요!!
4가지 짝이 어떻게 나오는지도 이해하실 수 있겠죠?serial = main
concurrent = global
기다림 = sync
못 기다림 = async라면을 순서대로 끓이고 아무것도 하지 않고 기다린다면 -> main sync
라면을 순서대로 끓이고 그동안 다른 일도 한다면 -> main async
라면을 동시에 작업해 끓이면서 아무것도 하지 않고 기다린다면 -> global sync
라면을 동시에 작업해 끓이면서 다른 일도 한다면 -> global async간단하게 사용 법도 간단한데요, DispatchQueue 를 호출한 다음 클로저 안에 원하는 동작을 해주면 된답니다 :)
DispatchQueue.main.sync { } DispatchQueue.main.async { } DispatchQueue.global().sync { } DispatchQueue.global().async { }
오늘은 간단하게 DispatchQueue에 대해서 살펴봤습니다.
조금이라도 도움이 되셨다면 좋겠네요! 감사합니다 :)
'iOS' 카테고리의 다른 글
[개발자 문서읽기] About App Development with UIKit (0) 2020.09.16 [개발자 문서읽기] Concurreny Proramming Guide - 1 (0) 2020.08.16 기기 회전 방향, interfaceOrientation 확인하기 in iOS 13.0 (0) 2020.07.20 CG, Core Graphics (0) 2020.07.12 iOS) 실 기기인지 simulator인지 확인하기 in Swift (0) 2020.06.10