GCD 관련 정리 잘한곳:
GCD란?
Grand Central Dispatch의 줄임말이다.
Swift에서 스레드 관련 작업은 Grand Central Dispatch API를 통해 처리한다.
GCD는 클로저 블록 안에 있는 특정 작업을 큐에 올리고, 해당 큐를 특정 스레드에 실행하는 방식이다.
멀티 코어와 멀티 프로세싱 환경에서 스레드 프로그래밍을 효율적으로 할 수 있도록 애플이 개발한 기술로써 적절하게 사용해 Thread-safe하게 구현하는 것이 중요하다.
우리가 Queue에 작업을 보내면 그에 따른 스레드를 적절히 생성해서 분배해주는데,
GCD에서 사용하는 queue의 이름이 Dispatch Queue이다.
-> Dispatch Queue에 작업을 추가하면 GCD는 작업에 맞는 스레드를 자동으로 생성해서 실행하고, 작업이 종료되면 스레드를 제거한다.
main vs gloabl
개발을 하다보면
DispatchQueue.main 또는 DispatchQueue.global 같은 것을 보게된다.
Swift의 쓰레드는 크게 main과 global로 나뉘게 되는데 (이 밖에도 Private queue도 있지만 해당 부분에서 다루지 않겠다)
main queue는 Serial queue이고, global queue는concurrent queue이다.
1. Main Queue
- 사용방법: DispatchQueue.main
- 한개만 존재 -> Main Thread에서 동작
- Serial(직렬)
- UI 처리를 담당
만약 쓰레드 없이 기본으로 작성되는 코드는 main queue에서 sync로 코드를 실행하겠다는 것과 같은 의미이다.
사용 방법
DispatchQueue.main.sync { } // 사용이 불가함(에러 발생)
DispatchQueue.main.async { } // 비동기적으로 main 쓰레드에 보냄
DispatchQueue.main.asyncAfter(.now() + 2) { } // 지금으로 부터 2초 뒤에 비동기적으로 main 쓰레드에 보냄
2. Global Queue
- 사용방법: DispatchQueue.global(qos: )
- QoS에 따른 6종류로 나뉨
- Concurrent(동시): 여러 개의 쓰레드로 분산 처리함
서비스 품질: QoS(Quailty of Service)
중요 순서: userInteractive > userInitiated > default > utility > background > unspecified
사용방법
// 유저와 직접 인터렉티브 : UI관련 (즉시)
DispatchQueue.global(qos: .userInteractive)
// 반드시 필요, 비동기 처리 : 앱 내에서 첨부파일을 열기, 내부 데이터베이스 조회 등 (몇초)
DispatchQueue.global(qos: .userInitiated)
// 일반적인 작업
DispatchQueue.global()
// ProgressIndicator와 함께 길게 사용되는 작업 : 지속적인 데이터 feed, Networking (몇초~몇분)
DispatchQueue.global(qos: .utility)
// 사용자가 직접적으로 인지하지 않는 부분 : 데이터베이스 유지 등 (속도보다는 에너지 효율성 중시)
DispatchQueue.global(qos: .background)
// 사용하지 않음 legacy API
DispatchQueue.global(qos: .unspecified)
작업을 쓰레드에 배치하는 일은 OS가 알아서 처리한다.
우선순위가 더 높은 큐의 작업을 우선적으로 더 많은 쓰레드에 배치하고, 배터리를 집중적으로 소모하게 된다.
큐에도 우선순위를 매길 수 있지만, 작업을 대기열에 보내는 방식도 QoS를 메길 수 있다.
background 품질의 global 큐를 생성했다고 하더라도, 작업을 utility 품질로 보낼 수 있다.
let queue = DispatchQueue.global(qos: .background)
queue.async(qos: .utility) { ... }
// background queue도 작업의 품질에 영향을 받아 utility로 상승하게 됨
<async, sync> vs <concurrent, serial>
1. async, sync: 단일 작업에 관한 개념
2. concurrent, serial: 앞 작업과 뒷 작업에 관한 개념으로, queue에 사용
참고 링크:
https://velog.io/@ryalya/iOS-CS-Study-GCD%EB%9E%80
[iOS CS Study] GCD란?
21.07.03 공부한 것을 정리하는 용도의 글이므로 100% 정확하지 않을 수 있습니다. 참고용으로만 봐주시고, 내용이 부족하다고 느끼신다면 다른 글도 보시는 것이 좋습니다. + 틀린 부분, 수정해
velog.io
GCD 관련 정리 잘한곳:
GCD란?
Grand Central Dispatch의 줄임말이다.
Swift에서 스레드 관련 작업은 Grand Central Dispatch API를 통해 처리한다.
GCD는 클로저 블록 안에 있는 특정 작업을 큐에 올리고, 해당 큐를 특정 스레드에 실행하는 방식이다.
멀티 코어와 멀티 프로세싱 환경에서 스레드 프로그래밍을 효율적으로 할 수 있도록 애플이 개발한 기술로써 적절하게 사용해 Thread-safe하게 구현하는 것이 중요하다.
우리가 Queue에 작업을 보내면 그에 따른 스레드를 적절히 생성해서 분배해주는데,
GCD에서 사용하는 queue의 이름이 Dispatch Queue이다.
-> Dispatch Queue에 작업을 추가하면 GCD는 작업에 맞는 스레드를 자동으로 생성해서 실행하고, 작업이 종료되면 스레드를 제거한다.
main vs gloabl
개발을 하다보면
DispatchQueue.main 또는 DispatchQueue.global 같은 것을 보게된다.
Swift의 쓰레드는 크게 main과 global로 나뉘게 되는데 (이 밖에도 Private queue도 있지만 해당 부분에서 다루지 않겠다)
main queue는 Serial queue이고, global queue는concurrent queue이다.
1. Main Queue
- 사용방법: DispatchQueue.main
- 한개만 존재 -> Main Thread에서 동작
- Serial(직렬)
- UI 처리를 담당
만약 쓰레드 없이 기본으로 작성되는 코드는 main queue에서 sync로 코드를 실행하겠다는 것과 같은 의미이다.
사용 방법
DispatchQueue.main.sync { } // 사용이 불가함(에러 발생)
DispatchQueue.main.async { } // 비동기적으로 main 쓰레드에 보냄
DispatchQueue.main.asyncAfter(.now() + 2) { } // 지금으로 부터 2초 뒤에 비동기적으로 main 쓰레드에 보냄
2. Global Queue
- 사용방법: DispatchQueue.global(qos: )
- QoS에 따른 6종류로 나뉨
- Concurrent(동시): 여러 개의 쓰레드로 분산 처리함
서비스 품질: QoS(Quailty of Service)
중요 순서: userInteractive > userInitiated > default > utility > background > unspecified
사용방법
// 유저와 직접 인터렉티브 : UI관련 (즉시)
DispatchQueue.global(qos: .userInteractive)
// 반드시 필요, 비동기 처리 : 앱 내에서 첨부파일을 열기, 내부 데이터베이스 조회 등 (몇초)
DispatchQueue.global(qos: .userInitiated)
// 일반적인 작업
DispatchQueue.global()
// ProgressIndicator와 함께 길게 사용되는 작업 : 지속적인 데이터 feed, Networking (몇초~몇분)
DispatchQueue.global(qos: .utility)
// 사용자가 직접적으로 인지하지 않는 부분 : 데이터베이스 유지 등 (속도보다는 에너지 효율성 중시)
DispatchQueue.global(qos: .background)
// 사용하지 않음 legacy API
DispatchQueue.global(qos: .unspecified)
작업을 쓰레드에 배치하는 일은 OS가 알아서 처리한다.
우선순위가 더 높은 큐의 작업을 우선적으로 더 많은 쓰레드에 배치하고, 배터리를 집중적으로 소모하게 된다.
큐에도 우선순위를 매길 수 있지만, 작업을 대기열에 보내는 방식도 QoS를 메길 수 있다.
background 품질의 global 큐를 생성했다고 하더라도, 작업을 utility 품질로 보낼 수 있다.
let queue = DispatchQueue.global(qos: .background)
queue.async(qos: .utility) { ... }
// background queue도 작업의 품질에 영향을 받아 utility로 상승하게 됨
<async, sync> vs <concurrent, serial>
1. async, sync: 단일 작업에 관한 개념
2. concurrent, serial: 앞 작업과 뒷 작업에 관한 개념으로, queue에 사용
참고 링크:
https://velog.io/@ryalya/iOS-CS-Study-GCD%EB%9E%80
[iOS CS Study] GCD란?
21.07.03 공부한 것을 정리하는 용도의 글이므로 100% 정확하지 않을 수 있습니다. 참고용으로만 봐주시고, 내용이 부족하다고 느끼신다면 다른 글도 보시는 것이 좋습니다. + 틀린 부분, 수정해
velog.io