본문 바로가기

iOS

[iOS] GCD에 대해서 알아봅시다

www.raywenderlich.com/5370-grand-central-dispatch-tutorial-for-swift-4-part-1-2

developer.apple.com/documentation/DISPATCH

[사진 1]

안녕하세요! 오늘은 GCD에 대해서 알아볼 것입니다 (Grand Central Dispatch) 

iOS에서 task를 처리하는 방식은 크게 두가지가 있는데, 바로 오늘 진행할

DispatchQueue, 그리고 이전에 진행한 operation Queue가 있습니다.

신뢰의 공식문서로부터 읽으면 

GCD ( Dispatch ) 는 멀티코어 환경에서, 시스템에 의해 관리된 dispatch Queue에 의해 코드를 동시성있게 실행한다 

 

이 GCD API는 task를 어떤 스레드가 처리할 것인지,

어느 우선순위로 처리할 것인지, sync하게 처리할것인지, async하게 처리하는지 등을 결정하게 됩니다.

 

Dispatch는 먼저 프레임워크이고, 큐 형태의 아이템 대기열이라고 생각하고,

그럼 이제 task가 대기열에 들어왔으니, 업무를 수행해야 할 차례입니다.

 

다음 공식문서 

[사진 2]

짜잔

DispatchQueue는 task를 관리하는데!!!!!!!

 

1. Thread가 main thread인지 / background thread 인지 

2. Queue가 serial 한 방식인지 concurrent한 방식인지  

로 task를 관리할 수 있다고 합니다. 

네가지 중점 용어를 정리하면,

 

main              :  Main Thread에서 처리되는 Serial Queue

global            :  전체 시스템에서 처리되는 Concurrent Queue. 

 

각 queue는 Serial Sync, Serial Async / Concurrent Sync, Concurrent Async 으로 구분할 수 있습니다. (4가지)

sync               : queue에 추가된 작업이 끝날때까지 작업을 기다렸다가 수행

async             : 큐에 작업은 추가되나, 작업완료 여부는 보장하지 않음.

 

커스텀 큐도 만들 수 있습니다. (글 쓰는 중~!)

서버와 비동기적으로 네트워킹을 해서, 결과를 가져온 다음에 데이터를 UI에 붙여줄 때 

메인 스레드임을 보장하기 위해서는 아래에서 어떤 코드를 쳐야할까요? 그리고 왜 그럴까요?

아래에서 이어서 알아보겠습니다.

 

[사진 3]

위와 같이 네가지 형태로 나뉘는데, 각각 무슨 역할을 하는지 알아보겠습니다

1. DispatchQueue.main.async

직역해서 보면, 1. main thread를 사용하고 2. concurrent하게 동작하게 됩니다. (병렬, 동시성)

그런데 원래 메인스레드는 Serial Queue였죠? 따라서 global()한 코드가 모두 동작한 이후에 처리되게 됩니다.

[사진 4]

짜잔

또한, UI는 모두 메인스레드에서 그려야 하는데요, 이유에 대해 복잡한 이유가 있지만

잘 설명된 zeddios.tistory.com/519 블로그 링크를....첨부합니다!

2. DispatchQueue.main.sync

원래도 메인큐는 serial sync인데, 이 디스패치 큐도 main.sync를 호출하고 있습니다.

그럼 원래의 queue 1을 블락하고, task를 담은 새로운 큐 2는 원래의 큐1 이 끝난다음에 일을 수행해야지 하며 기다리겠죠?

그런데 원래의 큐 1은 이미 블락을 당했으므로 일을 시작할 수 없습니다 ( 원문 : 맨 위 raywrenderich 링크)

>> 데드락 발생

>> 애초에  저 코드는 컴파일 에러가 발생합니다. thread-safe에 대한 원문을 읽어보기를 추천드려요!

3. DispatchQueue.global().sync

아까 위에서 언급했듯, main Queue는 기본적으로 serial queue, global Queue는 concurrent queue인데요,

원래의 serial queue를 막고, 자신의 queue가 먼저 실행된 뒤에 다른 작업을 수행시키겠네요.

[사진 5]

짜잔

4. DispatchQueue.global().async

Concurrent Async 큐를 한번 만들어봅시다. 예상컨데, 

큐의 실행순서는 보장되지 않고, 큐 안의 내용물의 순서만 보장될 것입니다.

 

[사진 6]

짜잔 

마지막 실행사진은 매번 다를것입니다!

 

간단히 알아보았지만, 단순히 알아보기에는 너무 중요한 내용이여서 추가적으로 공부하고 

양질의 블로그 포스팅이 필요할 듯 합니다. 

 

부족한 내용이 있거나 틀린점이 있다면 댓글 달아주시면 정말 감사하겠습니다~!

감사합니다. ^_^