이번 포스팅에서는 Sync, Async, main, global에 대해서 알아보도록 하겠습니다!
[Instance Method] Sync
Sync란 Work Item을 Queue에다가 실행을 위해 제출하고, 해당 block이 실행을 마치면, 리턴해주는 메서드 입니다.
dispatchQueue.sync {
<#code#>
}
dispatchQueue.sync(execute: <#T##DispatchWorkItem#>)
이런 방식으로 만들어질 수 있습니다!
1 ~ 5 그리고 6 ~ 10 까지 출력을 하는 두가지의 for 구문을 작성하여 sync block에 넣어서 코드를 작성해 보겠습니다.
dispatchQueue.sync {
for i in 1...5 {
print("\(i)")
}
}
dispatchQueue.sync {
for i in 6...10 {
print("\(i)")
}
}
코드를 실행시키면
이러한 실행결과가 나오게 됩니다. 1 ~ 5를 출력하는 for문이 먼저 dispatchQueue에 할당되어 1 ~ 5를 출력하는 block이 끝나면 6 ~ 10 을 출력하는 for문이 포함된 block을 할당하여 출력 결과와 같이 순서대로 출력되는 것을 볼 수 있습니다.
[Instance Method] Async
Work Item을 즉시 실행하도록 스케줄링 하고 그 반환값을 즉시 받아보는 메서드입니다.
dispatchQueue.async {
<#code#>
}
dispatchQueue.async(execute: <#T##DispatchWorkItem#>)
이런 형태로 만들 수 있겠습니다.
Sync에서 처럼 1 ~ 5를 출력하는 for구문 block과 6 ~ 10을 출력하는 for구문 block을 출력하는 코드를 작성해 보겠습니다.
dispatchQueue.async {
for i in 1...5 {
print("\(i)")
}
}
dispatchQueue.async {
for i in 6...10 {
print("\(i)")
}
}
코드를 실행시키면
Sync와는 확실히 다른것이 보이시나요? 각각의 for 구문이 돌아가는 순서는 바뀌지 않았지만 두가지의 for 구문이 하나하나 print를 하는 즉시 바로바로 화면에 출력을 해 주어서 이렇게 뒤죽박죽 나오게 되는것입니다.
[Type Property] main
이번에는 Dispatch Queue의 main에 대해서 알아보겠습니다.
class var main: DispatchQueue { get }
main은 현재 프로세스의 메인 스레드와 연결되어 있는 Dispatch Queue입니다.
시스템은 자동으로 main queue를 만들고, 그것을 애플리케이션의 main thread와 연결합니다.
Application은 main queue에 접근하여 실행할 수 있는 block을 제출하는 3가지 방법중 한가지만을 사용할 수 있습니다.
- dispatchMain() 호출
- UIApplicationMain(_:_:_:_:) 또는 NSApplicationMain(_:_:)에서 앱을 시작하는 방법
- Main Thread에서 CFRunLoop를 사용하는 방법
[Type Method] global
class func global(qos: DispatchQoS.QoSClass = .default) -> DispatchQueue
global은 Type Method입니다. global(qos: )로 사용할 수 있으며, quality-of-service가 지정된 global system queue를 반환해 줍니다.
여기서 quality-of-service는 시스템이 작업을 실행하도록 스케줄링 하는 우선순위를 결정해 줍니다.
이 메서드를 사용하면, qos에 알맞은 실행하려고 하는 작업을 처리해 줄 queue를 반환해 줍니다.
returned queue에 제출된 작업들은 서로에 대해 Concurrently 하게 스케줄링 됩니다.
흠.. 실제로 global과 main의 차이를 이해하기 위해서 똑같이 async를 설정해주고 아래와 같은 코드를 작성해 보았습니다.
dispatchQueueMain.async {
for i in 1...5 {
print("\(i)")
}
}
dispatchQueueMain.async {
for i in 6...10 {
print("\(i)")
}
}
우선 main입니다. 위 코드를 실행시켜보면
순서대로 출력하는 모습을 볼 수 있습니다!
이번엔 global입니다.
dispatchQueueGlobal.async {
for i in 1...5 {
print("\(i)")
}
}
dispatchQueueGlobal.async {
for i in 6...10 {
print("\(i)")
}
}
위 코드를 실행시켜보면!
'Swift' 카테고리의 다른 글
Type Methods (static func & class func) (0) | 2022.03.23 |
---|---|
Sequence (0) | 2022.01.28 |
Unowned? (0) | 2021.02.28 |
Dispatch(1) : What is Dispatch and Dispatch Queue? (0) | 2021.01.13 |
Parse JSON with Swift (0) | 2020.12.23 |