멀티쓰레딩(Multithreading)
일을 처리하는 별도의 쓰레드를 갖추는 것
iOS에서 멀티쓰레딩은 '큐'(일을 처리하기 위해 줄을 서는 것)와 같음
큐가 여러 개가 있을 수 있고 시스템은 각각의 큐에서 꺼내서 각각의 쓰레드에서 작동
'Serial'(직렬)로 동작 : 큐에서 맨 위에 있던 함수가 꺼내져서 처리가 끝나면 그 다음 것이 처리
'Concurrnet'(병렬)로 동작: 큐 맨 위에 있던 것이 꺼내져서 쓰레드에서 처리되기 시작. 놀고 있는 쓰레드가 있으면 큐에서 다음걸 꺼내서 다른 쓰레드에서 처리
Main Queue(메인 큐)
- 모든 UI가 작동해야 할 곳에서 사용
- 시간이나 리소스를 잡아먹는 UI 외의 모든 처리는 메인 큐 밖에서 처리
- 메인 큐에서 동작하는 것들은 직렬 처리 - UI가 차례에 맞게 그려지도록 순서대로 처리
- 메인 큐가 클로져나 함수를 꺼내 작업처리하는 유일한 때는 메인큐가 한가할 때임(처리하고 있지 않을 때)
Custon Queue(프라이빗 큐)
- 사용자 설정 큐
- 기본적으로 Serial(직렬) - 하나의 쓰레드 사용
- 동시큐 선언 가능
- Qos 설정 가능
- 메인큐만큼은 아니지만 높은 우선 순위를 가짐
DispatchQueue(label: "name") //serial
DispatchQueue(label: "name", attributes: .concurrent) //concurrent
Other Queues(글로벌 큐)
- UI가 아닌 것들을 처리할 때 사용할 큐
- DispatchQueue.global()
- Qos에 따라 여러개로 나뉨
* Qos
시스템이 특정 서비스에 얼마나 중점을 두는지 의미
//우선순위 높음
DispatchQueue.global(qos: .userInteractive) //유저와 직접적 인터렉트(드래그하면서 계산 등)
DispatchQueue.global(qos: .userInitiated) //시간이 조금 걸릴지도 모르지만 곧바로 돌아와야할 때
DispatchQueue.global() //일반 작업
DispatchQueue.global(qos: .utility) //데이터 패칭, 데이터베이스 비우기 등과 같은 긴 작업
DispatchQueue.global(qos: .background) //지금 당장 중요하지 않은 작업(오늘해도 되고 내일해도 되고..)
DispatchQueue.global(qos: .unspecified)
//우선순위 낮음
* 큐 인자를 어떻게 가져올까?
DispatchQueue.global().async {
DispatchQueue.main.async {
// UI 관련 코드
}
}
바깥의 클로저는 메인큐에 등록만 하고 종료.
mainQueue에서 최우선순위로 올때까지 기다렸다가 메인큐가 한가해지면 그때 꺼내져서 실행됨
* Example of multithreadded iOS API
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
if let url = NSURL(string: "http://url"){
let request = NSURLRequest(URL: url)
let task = session.downloadTaskWithRequest(request){
(localURL, response, error) in
DispatchQueue.main.async(){
//UI 작업
}
}
task.resume()
}
URL이 로드되길 기다리느라 메인큐가 막히는 것을 원하지 않음
클로저에서는 바로 UI작업할 수 없음(메인큐가 아니기 때문)
따라서 DispatchQueue.main.async()로 메인큐를 불러와서 UI 작업을 실행함
이해에 참고한 블로그
'iOS > 스탠포드 iOS 강의' 카테고리의 다른 글
[스탠포드iOS] UITextField (0) | 2024.04.29 |
---|---|
[스탠포드iOS] 프로토콜(Protocol) (0) | 2024.03.27 |
[스탠포드iOS] 익스텐션(Extensions) (0) | 2024.03.27 |
[스탠포드iOS] 클로저(Closure) (0) | 2024.03.26 |
[스탠포드iOS] 메모리 관리 (0) | 2024.03.25 |