[iOS] 차근차근 시작하는 GCD — 2

GCD와 Operation에 대해 알아봅시다

naljin
6 min readOct 9, 2020

Previously on GCD…

많은 작업(task)들을 여러개의 스레드로 잘~ 분산 처리하기 위해서 우리가 해야할 일은?

작업을 큐로 보낸다

ㅇㅕ기까지가 저번 시간의 핵심 내용이었죠.

메인 스레드에 몰린 task를 queue에 보내기만 하면 다른 스레드를 적절히 생성해서 분배해준다니..!🤩 스레드에 대해 1도 모르는 사람(aka 나)이 직접 생성 및 조작하는 것보다는 훨씬 효율적일 것 같쥬?ㅎ

자 오늘은 편리한 동시성 프로그래밍(다수의 스레드에 적절히 일을 분배시켜서 동작하도록 하는 것)을 위해 iOS 에서 지원하는 기술들을 알아봅시다.

GCD (Grand Central Dispatch)

다수의 스레드에 적절히 작업을 분배시키기 위해 우리가 할 일은 task를 queue에 넣는 것! 이라고 했죠?

그럼 다수의 스레드에 작업을 분배시키는 일은 누가하는데!

GCD는 우리가 Queue에 작업을 보내면 그에 따른 스레드를 적절히 생성해서 분배해주는 첫번째 방법입니다.

그리고 GCD에서 사용하는 queue의 이름이 Dispatch Queue 인거죠!

즉! Dispatch Queue에 작업을 추가하면 GCD는 작업에 맞는 스레드를 자동으로 생성해서 실행하고, 작업이 종료되면 스레드를 제거하게 됩니다.

그림으로 나타내면 이렇게 될 것 같아요.

여러분 근데 Dispatch가 뭔 뜻인줄 알아여?

DispatchQueue 자체가 “큐에 보내다” 라는 뜻이라니 ㅎㅎ 재밌군여

코드로 봅시다

DispatchQueue.global().async {
//task
}

이런식으로 씁니다.

하나씩 뜯어보자면

  • DispatchQueue: iOS에서 동시성 프로그래밍을 돕기 위해 제공하는 queue
  • global: DispatchQueue의 종류
  • async: 비동기

인데, 한글로 해석해보자면

global dispatch queue에 비동기로 task를 보낸다

정도가 되겠네요

dispatch queue의 종류인 global이나, 동작 방법인 async 같은거는 나중에 더 설명할테니 일단은 “흠.. 이렇게 보내는거군..” 하고 넘어가도록 해요

여기서 짚고 넘어가야할 건 {} 에 들어가는 task가 작업의 한 단위라는겁니다

즉, 클로저 내의 task는 하나의 작업 뭉탱이기 때문에 그 안의 동작들은 순차적으로 처리가 될거라는건데요...! 어찌보면 당연해 보일 수도 있지만 나중에 헷갈릴 일이 있을 수도 있기 때문에 강조가 되는거겠죠?

DispatchQueue.global().async {
//작업 자체가 묶이는 개념
print("Task1 시작")
print("Task1 의 중간작업 1")
print("Task1 의 중간작업 2")
print("Task1 의 중간작업 3")
print("Task1 의 중간작업 4")
print("Task1 의 중간작업 5")
print("Task1 종료")
}

저 안에서 프린트는 순서대로 찍혀 나올 것입니다. 이해 완료!?

Operation

GCD는 우리가 Queue에 작업을 보내면 그에 따른 스레드를 적절히 생성해서 분배해주는 첫번째 방법이라고 했죠?

Operation비슷한 기능을 해요. Operation에서 사용하는 queue의 이름은 Operation Queue 고요. 쉽쥬?

사실 얘도 내부적으론 GCD 위에서 동작하긴 해요. 다만 좀 더 기능들이 추가된 형태입니다!

  • 동시에 실행할 수 있는 동작의 최대 수 지정
  • 동작 일시 중지 및 취소

“엥 Operation이 기능이 더 많고 좋아보이는데 무조건 얘로 구현하면 되는거 아니냐?” 라고 생각할 수도 있을 것 같아요. 하지만 그러기엔 구현이 조금 더 복잡합니다.. ㅎㅎ

따라서 뭘 써야한다! 라고 정해진건 없고 그때 그때 상황에 따라 적합한걸 쓰면 됩니다요~!

마무리

오.. 어떻게든 두번째 글까지는 썼군요.. 과연 세번째 글도 쓸 수 있을 것인가! ㅎㅎ 저도 모르겠다리~~ 그럼 20000~~

이전 포스팅 👈🏻

다음 포스팅 👉🏻

출처

--

--