You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Dispatch, also known as Grand Central Dispatch (GCD), contains language features, runtime libraries, and system enhancements that provide systemic, comprehensive improvements to the support for concurrent code execution on multicore hardware in macOS, iOS, watchOS, and tvOS. (파파고로 해석해보면, GCD(Grand Central Dispatch)라고도 하는 Dispatch는 동시 코드 실행(동시성 프로그래밍)에 대한 개선 사항을 제공하는 언어 기능(API), 런타임 라이브러리 및 시스템 개선 사항이 포함되어 있다는 뜻)
동시성 프로그래밍이란 메인 스레드에 몰린 작업들을 다른 스레드에서도 동시에 작업하도록 하는 것 (쉽고 편한 멀티 스레딩 처리를 도와준다고 이해)
멀티 스레딩 처리를 하기 위해선 메인 스레드 외에도 여러 스레드에 일을 분배해줘야하는데, iOS에서는 queue를 활용(Queue의 선입 선출을 활용)
즉, GCD에서 사용하는 queue의 이름이 Dispatch Queue
Dispatch Queue에 작업을 추가하면 GCD는 작업에 맞는 스레드를 자동으로 생성해서 실행하고, 작업이 종료되면 스레드를 제거
// 예제 코드 뜯어보기
DispatchQueue.global().async{
//task
}
DispatchQueue: iOS에서 동시성 프로그래밍을 돕기 위해 제공하는 queue
global: DispatchQueue의 종류
async: 비동기
⇒ global dispatch queue에 비동기로 task를 보낸다
들어가기 앞서 동기? 비동기?
동기 (Synchronous)
Synchronous의 사전적 의미는 "동시 발생하는" 이라는 뜻을 가짐. 그러면 “async 아님?”이라는 의문을 가질 수 있지만, 여기서 '동시 발생' 이라는 것은 작업이 동시 발생 한단 게 아니라 '요청' - '응답'이 동시 발생한다는 말
즉, 내 작업이 끝나기 전까진 다른 작업을 수행하지 못함
스레드에서 보낸 작업이 끝날 때까지 현재 스레드는 다른 작업을 하지 않고 기다림 (sync는 큐에 작업을 추가한 후 그 작업이 완료될 때까지 기다린다고 생각하면 쉬움)
해당 작업이 끝날 때 까지 스레드는 다른 작업 하지 않고 Block상태를 유지
동기적으로 보내는 코드를 짜는 것 ⇒ 실질적으로는 메인쓰레드에서 일을 한다고 이해하면 됨
비동기 (Asynchronous)
동기의 반대 개념으로 이해하면 쉬움. 즉, 내 작업이 끝나기 전에 다음 작업을 실행한다는 말
보낸 작업이 끝나는 것을 기다리지 않고 현재 스레드는 다른 작업을 시작 (async는 큐에 작업을 추가 후 그 작업이 완료될 때까지 기다리지 않는다고 생각하면 이해하기 쉬움)
자원을 효율적으로 활용할 수 있을 뿐더러, 동기 보다 대기시간을 줄일 수 있다.
비동기에서는 요청에 대한 응답이 나중에 오기 때문에 보통 Callback 함수로 들어옴 (ex: completionHandler 또는 completion)
들어가기 앞서 직렬? 동시?
비동기, 동기로 보낸 작업들을 순차적으로 실행 시킬지 말지 정하는게 Serial & Concurrent 개념
직렬큐(순차처리큐) 또는 동시큐(순차고려x큐)
직렬 (Serial)
단 하나의 쓰레드로만 작업을 보내는 대기열
Serial Queue란 한 번에 하나의 작업(task)만을 실행, (즉 처리중인 작업이 완료되기 전까지는 새로운 작업 처리를 시작하지 않음)
GCD에서 보자면 mainQueue → mainthread로 보내는 것
main queue가 대표적인 Serial Queue ⇒ Serial은 내 Queue에 들어온 작업들을 순차적으로 실행 시키겠다는 의미로 해석
동시 (Concurrent)
여러개의 다른 쓰레드로 작업을 보내는 대기열
Concurrent Queue란 동시에 여러 작업(task)을 실행 (큐에 추가된 순서대로 실행되지만, 앞의 작업이 완료되기를 기다리지 않기 때문에 여러 작업 실행이 가능)
GCD에서 보자면 globalQueue or customQueue에서 여러 스레드로 나눠 보내는 것
Concurrent는 내 Queue에 들어온 작업들을 동시다발적으로 실행 시키겠다 의미
Serial과 다르게 한 번에 여러 개의 Task를 실행시킬 수 있기 때문에 순차적이지 않음 (순서가 상관 없게됨)
동기/비동기와 직렬/동시는 다르다.
동기/비동기
큐로 보내고 현재의 스레드는 다른 작업을 할 수 있게 할지 말지 결정. (다른 작업 가능 or 불가능)
DispatchQueue.main.sync{...} // 사용 불가능
DispatchQueue.main.async{...}
main queue는 Serial Queue
이곳에 할당된 task는 메인 스레드에서 처리 (모든 UI 처리는 메인 스레드에서 처리)
Global Queue
DispatchQueue.global().sync{} // global().sync는 의미가 없다. 작업을 글로벌 큐로 보내고 메인의 작업이 끝날 때까지 기다리고 일을 시작하기 때문에 (일을 동기적으로 하기 때문에)
DispatchQueue.global(qos:.utility).async{}
global queue는 Concurrent Queue
DispatchQueue.global().sync는 글로벌 큐로 작업들을 보낼 뿐, 작업을 비동기적으로 진행하지 않으므로, 거의 쓰이지 않는다.
GCD ?
⇒ global dispatch queue에 비동기로 task를 보낸다
들어가기 앞서 동기? 비동기?
동기 (Synchronous)
비동기 (Asynchronous)
completionHandler
또는completion
)들어가기 앞서 직렬? 동시?
직렬 (Serial)
단 하나의 쓰레드
로만 작업을 보내는 대기열동시 (Concurrent)
여러개의 다른 쓰레드
로 작업을 보내는 대기열동기/비동기와 직렬/동시는 다르다.
동기/비동기
직렬/동시
GCD API
Main Queue
Global Queue
Custom Queue
label
을 붙이면 custom queue가 됨요약
들어온 작업
을 순차적큐(메인큐) 로 보내던가 동시큐(글로벌큐) 로 보내던지큐로 보내는걸 결정
맨 뒤
로 보내지게 됨작업을 보낸 현재의 그 스레드
에서 보낸 작업이 끝날때 까지 다른 작업을 할것인지 안할것인지 (동기 비동기) 결정참고자료
The text was updated successfully, but these errors were encountered: