티스토리 뷰

멀티쓰레딩(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 작업을 실행함

 

이해에 참고한 블로그

https://clamp-coding.tistory.com/375?category=1003889

최근에 올라온 글
Total
Today
Yesterday