Swift

Dispatch(2) : Sync / Async / main / global

JoonSwift 2021. 1. 13. 20:20

이번 포스팅에서는 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