Thread Managing (GCD)

Eli·2021년 2월 8일
1

iOS

목록 보기
9/11

[iOS] GCD(Grand Central Dispatch)

iOS ) 왜 main.sync를 하면 안될까

Background

Multi-Thread를 처음 접하게 됐던 때는 REST API를 처음으로 작업을 할 때이다.

가뜩이나 처음 API를 작업해보는데 생각보다 CallBack이 오래걸리는 API 작업이었다.

나는 당연히 ViewController내에 API 호출 함수를 만들고 그를 호출해 데이터를 바인딩 시켜주었다.

viewWillAppear에서 함수를 호출했는데 화면이 너무 느리게 뜨는게 아닌가. 그때 이게 멀티쓰레딩이 필요한 순간이 아닌가?라고 생각하며 직감했다.

  1. iOS에서 UI는 main이라는 것에서만 돈다는 것은 들었던 것 같고
  2. ViewController는 당연히 main일테고
  3. API가 콜백이 올때까지 main은 그것을 기다리며 멈춰있을테니까...

그때 나는 처음 iOS multi thread를 처음 찾아 보았다.

GCD

iOS에서는 Grand Central Dispatch(GCD)라는 것을 통해 Threading작업을 할 수 있다고 하는데, 사실상 우리가 직접 iOS에서 Thread를 다루는 것이 아니라 Queue에 올려둬 iOS에게 관리와 실행을 넘겨주는 api인 것이다.

이전엔 직접 Thread와 OperationQueue등으로 직접 수행을 했다고하는데 코드도 복잡해지고 굉장히 무거웠다고 한다(들었을뿐)

아무튼 Apple 문서에서는 GCD를 통해서 작업을 하라고 권장하고 있다.

2가지의 DispatchQueue

GCD 컨셉에서 가장 핵심적인 개념이다.

Queue:

Task를 FIFO순으로 가지고 있는 대기열이며, 이곳에 올려두면 iOS에서 알아서 Task를 가져다 진행을 한다. 실제로 Thread = Queue는 아니다. Queue에 올려두면 어떤 Thread에서 할지는 iOS가 결정하고 책임을 진다.

DispatchQueue:

iOS의 Queue에 작업을 전달하는 방법. Task를 Block 단위로 묶어 간편하게 클로저로 전달을 할 수 있다.

//Dispatch Queue에서 전달 방법
DispatchQueue.main.async {
	//해당 Queue에서 진행할 작업.
}

Serial Queue

Queue에 추가된 순서대로 한번에 한개씩의 Task를 관리함

iOS가 실행될 때 기본으로 생성이 되는 Main Queue가 Serial으로 구현이 되어 있다.

Concurrent Queue

Concurrent는 병렬로 작업을 처리하는 방식인데 이는 실제 물리적인 thread 병렬처리와 다르다.

사실 한개의 Thread에서
1작업 잠깐
2작업 잠깐
이런식으로 처리를 하는 방식으로 구현이 되어있다.

Queue이기 때문에 실제로 어떤 Thread에서 작업을 하는지에 대한 것은 모른다. iOS 에서 관리를 하기 때문에 그때그때 다를 수도 있고.

Queue를 다른 곳에서 실행한다고 해도 같은 Thread에서 수행이 될 수 있다는 말이다.

Global Queue

UI작업을 제외한 시간이 오래걸리거나 메인에서 자주 사용하지 않는 작업은 Global로 빼서 작업을 한다.

Global Queue는 Concurrent Queue이며, Qos(Quality of Service)로 우선순위를 지정해줄 수 있다.

우선순위의 내용은 아래와 같다.

아래와 같이 사용 할 수 있다.

DispatchQueue.global(qos: .userInitiated).async {
		// 작업할 내용
}

Sync와 Async

사실은 sync와 Async의 차이를 기존의 병렬처리와 잘못 이해하고 있었으며, 이번 스터디를 통해 가장 크게 느낀 부분이다.

Sync: 어떠한 작업을 Queue에 올려 놓으면 해당 작업의 결과나 완료 이후에 다음 코드를 실행할지 말지를 결정하는 것.

Async: 어떠한 작업을 단지 Queue에 올려두기만 하는 것. 작업에 완료에 대한 보장이나 기다림 같은 것은 없다.

그러므로 Queue에 따라 총 4개의 케이스가 나올 수 있다.

  1. Main - async
  2. Main - sync (금기 사항이다) 이유는 상단 링크 참조
  3. Global - async
  4. Global - sync

아마 가장 쉽게 마주하게 되는 것은

Global - async 조합을 가장 많이 쓰게 될 것 이며, 해당 콜백을 UI에서 반영하기 위해서 Main - async를 통해 UI에 반영하는 방식이 가장 일반적이다.

profile
애플을 좋아한다. 그래서 iOS 개발을 한다. @Kurly

0개의 댓글