버그 잡이

iOS - GCD & Dispatch Queue 본문

IOS

iOS - GCD & Dispatch Queue

버그잡이 2020. 8. 11. 22:11

 

GCD는 멀티코어와 멀티프로세싱 환경에서 최적화된 프로그래밍을 지원하기 위해 애플에서 개발한 기술입니다.

task를 비동기적으로 관리하는 것에 도움을 줍니다.

 

GCD는 dispatch queues라는 큐를 관리하는데요.

프로그래머가 실행할 태스크(작업)을 생성하고 Dispatch Queue에 추가하면 GCD는 태스크(작업)에 맞는 스레드를 자동으로 생성해서 실행하고 작업이 종료되면 해당 스레드를 제거합니다.

따라서, 개발자는 Dispatch Queue라는 클래스를 활용해서 GCD 기술을 활용할 수 있습니다.

 

 

장점

 

스레드 생성, 소멸과 같은 관리를 따로 해주지 않아도 알아서 해줍니다.

보다 쉽게 비동기 프로그래밍을 가능하게 해주는 것이지요.

또, 일반적으로 쓰레드를 직접 작성한 경우보다 빨리 task를 실행할 수 있다고 합니다.

 

 

 

 

 

Serial / Concurrent

Dispatch Queue에는 두 가지 종류가 있습니다.

  • Serial : 한번에 하나의 작업만
  • Concurrent : 여러 개의 작업을 동시에

(url을 통해서 이미지를 받고, 이를 앱 화면에 반영하는 코드입니다.)

DispatchQueue.global().async {
  guard let imageData = Data(contentOf: imageURL) else {return}

  DispatchQueue.main.async {
  	imageView.image = UIImage(data: imageData)
  }
}

하지만 위 예제를 보면 serial과 concurrent는 찾아볼 수 없습니다.

그 대신 main과 global이 보이네요.

main 스레드는 말 그대로 앱에서 main으로 동작하는 스레드입니다. serial queue이지요.

그리면 global은 뭘까요? 맞습니다. concurrent queue입니다.

global 큐에서 비동기로 imageData를 받고, 이를 main 큐에서 반영하는 코드입니다.

 

(UI와 관련된 작업은 main queue에서만 작업을 진행할 수 있기 때문에 queue안에 queue가 들어간 구조의 코드가 되었습니다.)

 

 

 

Sync / Async

 

sync를 호출한 메서드는 전달된 작업이 끌날 때까지 기다린다.

즉, 출력 순서를 보장하기 위해서는 sync를 활용할 수 있습니다

단, 데드락 이슈가 발생할 수 있기 때문에 주의해서 사용해야 합니다.

반대로 async는 순서가 보장되지 않습니다.

 

또, asyncAfter라는 것의 사용을 확인했습니다.

asyncAfter(deadline: .now() + 0.5)

이는 일정한 시간 뒤에 queue를 실행 시키고자 할 때 사용합니다.

위 코드는 현재 시간으로부터 0.5초 뒤에 실행되겠네요.

 

 

 

Qos

 

DispatchQueue.global(qos: .background).async { }

위와 같이 global에는 qos라는 파라미터가 들어갈 수 있습니다.

Quality of Service의 약자로 이를 잘 설정하면 품질 , 에너지 효율이 좋아진다고 합니다.

(즉, 앱이 좀더 빠르게 동작하겠죠?)

 

  • User-interactive

    새로고침, 애니메이션과 같이 사용자와 상호작용 하는 작업입니다.

    반응성과 성능에 중점을 둡니다.

  • User-initiated

    저장된 문서를 열거나, 사용자의 클릭 후 작업을 수행하는 것과 같은 즉각적인 결과가 필요한 경우

    반응성과 성능에 중점을 둡니다.

  • Utility

    데이터 다운로드와 같이 즉각적인 결과가 필요하지 않은 경우. (보통 progressBar와 동반하는 작업)

    반응성과 성능 그리고 효율성 간에 균형을 유지하는 데 중점을 둡니다.

  • Background

    indexing, 동기화, 백업과 같이 사용자가 볼 수 없는 작업

    에너지 효율성에 중점을 둡니다.

  • Default

    기본으로 설정되는 값으로 user-initiated와 utility 사이에 위치합니다.

 

 

*참고

https://zeddios.tistory.com/521

https://zeddios.tistory.com/516

https://www.edwith.org/boostcourse-ios/lecture/16916/

반응형
Comments