GCD
해야할 일(code blocks)들을 만들어서 GCD에 넘기면 시스템에서 알아서 스레드를 할당해서 안전하게 수행시켜 줍니다.
- GCD는 스레드 위에 만들어진 것 입니다.
- GCD는 이 테스크를 DispatchQueue를 이용해서 관리하게 됩니다
#Queue
- 자료구조입니다.
- First- in & First - out
- 들어온 순서대로 나가는 형태의 자료구조 입니다.
DispatchQueue
- Main Queue
- 메인 스레드에서 작동되는 큐입니다.
- Global Queue
- 시스템에 의해 관리되는 큐입니다
- 큐에 들어가는 테스크의 우선순위를 QoS(Quality of Service) 를 이용해서 표현할수 있습니다. 번호가 낮을수록 높은 순위 입니다.
- userInteractive - 바로 수행되어야할 작업을 표현할 때에 사용
- userInitiated - 사용자가 결과를 기다리는 작업. 거의 바로 수행
- default - 그렇게 잘 쓰이진 않지만 2보다 좀 덜중요한 작업
- utility - 수초에서 수분걸리는 작업. 무거운 작업 (네트워크, 파일불러오기 등)
- background - 사용자에게 당장 인식될 필요가 없는 작업들 ( 뉴스다운, 위치업데이트, 영상다운로드 등)
- Custom Queue
- 위에 2개는 시스템에서 제공해주는 큐입니다.
- 커스텀 큐는 개발자가 직접 큐를 만들어주어야 할때 사용합니다.
//Main Queue
DispatchQueue.main.async {
//DO any ui update here
}
//Global Queue
DispatchQueue.global(qos: background).async {
//DO heavey work here
}
//Custom Queue
let concurrentQueue = DispatchQueue(label: "concurrent", qos: .backgruond, attributes:.concurrent)
let serialQueue = DispatchQueue(label: "serial", qos: .backgruond)
두개의 Queue 같이 쓰기
- 예를 들면 큰 이미지 파일을 다운받으면서 화면에 뿌려주는 작업까지 하려면 두개의 큐를 복합적으로 사용하게 된다.
DispatchQueue.global(qos: .background).async {
let image = downloadImageFromServer()
DispatchQueue.main.async {
self.imageView.image = image
}
}
큐에 들어온 테스크를 GCD는 동기 비동기로 수행할수 있습니다
(Sync( 먼저들어온 테스크 끝내고 실행) & Async( 동시실행 ))
-
Async #### 네트워크, 다운받는 작업같은 경우 시간이 오래걸리기 때문에 Async ( 대부분 Async )
- 동기실행이기 때문에 두개의 큐가 같이 실행이 되고 qos부분의 우선순위를 보면 아래코드가 더높기 때문에 아래코드가 먼저 실행되는 것을 볼수있다.
2. Sync
- Sync는 비동기실행으로 아래의 코드가 우선순위가 더 높더라고 테스크가 들어오는 순서에 따라 우선순위로 실행되고 하나의 코드가 끝이나야 뒤의 코드가 실행된다.
- 보통 앞작업이 끝나야 뒷작업이 시작될수 있는경우 필요하다.
주의사항.
//복합적인 상황
func downloadImageFromServer() -> UIImage {
//Heavy Task
return UIImage()
}
func updateUI(image: UIImage){
}
DispatchQueue.global(qos: .background).async {
// download
let image = downloadImageFromServer()
// ui쪽은 main큐로 넘겨주어야 한다. 크래시 가능성을 가짐
DispatchQueue.main.async {
updateUI(image: image)
}
}
//Xcode에서 main thread가 백그라운드에서 발생하면 크래쉬를 발생시키기 때문에 메인 UI작업은 백그라운드가
// 아닌 메인에서 실행시켜주어야 한다.
'IOS > Swift' 카테고리의 다른 글
[TIL] Swift. Closure (0) | 2020.10.19 |
---|---|
[TIL] Swift. Type Casting(feat. is, as) (0) | 2020.10.18 |
[TIL] Swift. Frame and Bounds (0) | 2020.10.15 |
[TIL] Swift. awakeFromNib (0) | 2020.10.14 |
[TIL] Swift. ViewController LifeCycle (0) | 2020.10.12 |