안녕하세요 🐶
빈 지식 채우기의 비니🙋🏻♂️ 입니다.
오늘은 저번에 이어서 드디어! GCD 4편! GCD ( Grand Central Dispatch ) 관해 알아보는 시간을 가지겠습니다.
Sync, Async, Serial, Concurren에 대한 기본지식이 있다는 전재하에 포스팅을 진행을 합니다!
혹시 궁금하신 분들은 먼저 보고 오시면 더욱 이해가 쉬울거라 생각됩니다 ㅎㅎ :)
[ iOS ] GCD 2편 - Sync vs Async
안녕하세요 🐶 빈 지식 채우기의 비니🙋🏻♂️ 입니다. 오늘은 GCD 2편! Sync vs Async 관해 알아보는 시간을 가지겠습니다. GCD 1탄이 궁금하신 분들은 먼저 보고 오시면 더욱 이해가 쉬울거라 생
beanistory.tistory.com
[ iOS ] GCD 3편 - Serial vs Concurrent
안녕하세요 🐶 빈 지식 채우기의 비니🙋🏻♂️ 입니다. 오늘은 저번에 이어서 GCD 3편! Serial vs Concurrent 관해 알아보는 시간을 가지겠습니다. GCD 2탄이 궁금하신 분들은 먼저 보고 오시면 더욱
beanistory.tistory.com
1. Main Thread / Global Thread
평소 개발을 하다보면 정말 많이 보고 많이 쓰는 것들이므로 빠르게 짚고 넘어가겠습니당~
1-1. Main Thread
iOS 에서의 Main Thread는 오직 하나만 존재합니다.
우리가 평소에 개발하고 작업하는 모든 코드들이 바로 Main Thread에서 동작하고 있습니다~
또한 가장 중요한 개념 중 하나는 Interface Thread인데,
그 이유는 UI와 관련된 일련의 작업들은 반드시 Main Thread에서 작성해야 합니다.
이런 식으로 Run Time 에서 보라색 오류가 발생합니다.
"UI 관련 작업이니까 Main Thread에서 작업해 이놈아!" 라는 경고를 해주는 것이죠.
실제로 컴파일 에러와는 다르게 실제 구동에는 문제가 없습니다.
다만 시간이 많이 걸리는 작업을 Main Thread에서 실행하게 되면, 화면이 멈춘 것처럼 보일 때가 있습니다.
왜냐하면 Main Thread의 Main Queue는 Serial Queue 이므로 한번에 한개의 작업만을 수행할 수 있습니다.
따라서, UI 작업에 영향을 주거나 오래 걸리는 작업은 Global Thread에서 실행시켜야 합니다.
1-2. Global Thread ( Background Thread )
iOS에서의 Framework들은 모두 Background에서 구동이 된다.
실체는 Background에 있으나, 가끔 필요하거나
결과를 줄 때는 Main Thread에게 손 ( Delegate, Completion Handler ) 을 뻗는 구조입니다.
아래와 같은 예를 통해 설명이 가능하다.
1. 우리가 데이트를 랜더하기 위해 테이블 뷰를 생성하려고 한다.
2. 테이블 뷰를 생성하기 위해 특정 Framework를 사용한다.
3. 생성을 위한 작업들은 모두 Background에서 실행된다.
4. 생성 후, 테이블 뷰의 영역을 터치를 할 시 Delegate ( Main Thread ) 를 통해 우리에게 알려준다.
만약 위와 같은 작업들을 Main Thread에서 구현을 하게 된다면, 실행이 끝날 때까지 앱이 멈추는 형상을 보게 된다 ㅠㅠ..
자! 이제 Thread 종류에 대해 알아봤으니,
Queue 종류에 대해 말씀드리도록 하겠습니다.
2. NSOperation
Objective C 언어 기반의 고수준 API
Objective C로 구현된 GCD를 고수준 언어로 Wrapping 한 것이고,
따라서 GCD 보다 무겁고 약간의 오버헤드를 발생시킬 수 있습니다.
하지만 고수준 API인 만큼,
GCD보다 더 많은 기능을 사용할 수 있습니다.
동작 방식은 작업 단위인,
NSOperation을 NSOperationQueue에 추가하여 실행하는 방법인데,
이때! NSOperation Queue는 Concurrent Queue로 동작합니다.
- Concurrent Queue : 동시다발적으로 작업을 실행하는 Queue
3. GCD ( Grand Central Dispatch )
C언어 기반의 저수준 API
오래 기다리셨습니다!!!! ㅎㅎ 1~3편을 통해 기본 지식을 익히고 드디어! GCD가 나왔습니다 ~.~
GCD는 저수준 API 이기 때문에 NSOperation 보다 가볍고 성능면에서 좋습니다.
또한 클로져로 구현되어 있어 코드 가독성도 좋고 간단하게 사용이 가능하지만!
고수준 기능 ( 작업취소, 재사용 등등 ) 은 직접 만들어줘야하는 단점이 있습니다.. ㅠㅠ
먼저 Dispatch Queue에 대해 알아보도록 합시당 ~.~
3-1. Dispatch Queue
GCD에서는 Dispatch Queue 라는 것으로 작업을 관리하는데,
크게 2가지가 있습니다.
① Serial Queue
Task(work) 들을 순차적으로 처리하며,
한번에 한개의 Task 밖에 처리하지 못합니다.
② Concurrent Queue
동시에 여러 개의 Task(work)를 처리합니다.
또한! Dispatch Queue는 앱이 실행됨과 동시에 2가지 Queue가 생성되는데,
바로 Main, Global Queue 입니다.
① Main Queue (Serial Queue)
DispatchQueue.main.async {
// UI 및 Main에서 실행되는 작업
}
해당 Queue에서는 UI 관련 작업이 이루어져야 합니다.
다만 Main Queue를 Sync로 작업하려고 하면 문제가 발생하는데..
Sync로 구현하게 되면 Main Queue에서의 작업들에 대해 Dead Lock이 발생될 수 있습니다.
런타임 에러로 떨어지니까 Main Thread는 반드시 Async로 사용해야 합니다.
② Global Queue (Concurrent Queue)
DispatchQueue.global().sync {
//원하는 작업
}
DispatchQueue.global().async {
//원하는 작업
}
Global Queue는 Concurrent Queue로 동작이 되고,
Main Queue와 다르게 우선순위를 정할 수 있습니다.
이 Qos(우선 순위)를 통해 우리는 작업의 효율성을 늘릴 수 있습니다.
이러한 Qos(우선 순위)를 사용하고 싶으면 아래와 같이 사용하면 됩니다.
DispatchQueue.global(qos: .background).sync {
//원하는 작업
}
만약! 내가 직접 Queue를 만들고 싶다!!!
하면 아래와 같이 만들 수 있습니다.
let myQueue = DispatchQueue.init(label: "customQueue", qos: .background, attributes: .concurrent)
myQueue.async {
//원하는 작업
}
Attribute 인자를 통해 concurrent 인지 serial 인지 지정할 수 있어 Custom Queue 만들기 용이합니다.
이상으로 GCD 4편 - GCD ( Grand Central Dispatch ) 포스팅을 마치겠습니다.
틀린 부분이나 궁금한 사항은 댓글 남겨주세요~🤭
참고
'iOS📱 > Common' 카테고리의 다른 글
[디자인패턴] 커맨드 패턴 ( Command Pattern ) (0) | 2025.02.05 |
---|---|
[디자인패턴] MVC, MVP, MVVM (0) | 2025.02.05 |
[ iOS ] GCD 3편 - Serial vs Concurrent (0) | 2023.01.18 |
[ iOS ] GCD 2편 - Sync vs Async (2) | 2023.01.12 |
[ iOS ] GCD 1편 - 프로세스(Process) vs 쓰레드(Thread) (0) | 2023.01.11 |