반응형
앞서서는 GCD의 Global Queue를 사용하는데 필요한 이론을 알아봤으니, 이제 사용해보겠습니다.
globla-aync-noneQoS 예제
import Foundation
func forLoop(_ workName: String){
var result = 0
for _ in 1...10{
result += 1
}
print("[\(workName)] : \(result)")
}
var runLooop = RunLoop.current
DispatchQueue.global().async {
forLoop("global 1")
}
DispatchQueue.global().async {
forLoop("global 2")
}
DispatchQueue.global().async {
forLoop("global 3")
}
DispatchQueue.global().async {
forLoop("global 4")
}
runLooop.run()
결과는 1,2,3,4 순으로 출력되는것이 아니라 뒤죽박죽 출력됩니다.
병렬연산을 하면서 우선순위또한 없기 떄문이죠.
globla-aync-QoS 예제
import Foundation
func forLoop(_ workName: String){
var result = 0
for _ in 1...10{
result += 1
}
print("[\(workName)] : \(result)")
}
var runLooop = RunLoop.current
DispatchQueue.global(qos: .background).async {
forLoop("global 1")
}
DispatchQueue.global(qos: .utility).async {
forLoop("global 2")
}
DispatchQueue.global(qos: .userInitiated).async {
forLoop("global 3")
}
DispatchQueue.global(qos: .userInteractive).async {
forLoop("global 4")
}
runLooop.run()
이렇게 Qos로 우선순위를 준다면, 결과는 아까보다 비교적 4, 3, 2, 1 순으로 출력되게 됩니다.
예제가 단순히 결과출력만 하다보니 어떤 경향인지 자세히까진 안보일 수도 있는데,
func forLoop(_ workName: String){
var result = 0
for _ in 1...10{
result += 1
print("[\(workName)] : \(result)")
}
}
메서드를 이렇게 손보시면 좀 더 잘 보이실겁니다. 순차적으로 완벽히 까진 아니더라도
우선순위가 높은 작업을 먼저 수행하려는 경향이 있습니다.
globla-sync 예제
import Foundation
func forLoop(_ workName: String){
var result = 0
for _ in 1...10{
result += 1
}
print("[\(workName)] : \(result)")
}
var runLooop = RunLoop.current
DispatchQueue.global().sync {
forLoop("global 1")
}
DispatchQueue.global().sync {
forLoop("global 2")
}
DispatchQueue.global().sync {
forLoop("global 3")
}
DispatchQueue.global().sync {
forLoop("global 4")
}
runLooop.run()
이번엔 1,2,3,4로 무조건 실행되는 결과를 보실 수 있습니다.
sync가 순차적으로 작업을 실행할 수 있는 이유는
'다음 작업의 실행을 제한'하는 방식으로 작동되기 떄문입니다.
추가로, 메인스레드를 활용해 UI를 작업하는 방식은 다음과 같습니다.
DispatchQueue.global(qos: .userInteractive).async {
forLoop("선행 작업")
DispatchQueue.main.async {
print("선행 작업 후 UI 변경")
}
그런데 이상한점이 있죠? RunLoop 저 친구는 뭘까요?
위의 예제에서 runLoop.run()을 실행하지 않으면 2개의 작업만이 처리됩니다. 왤까요?
RunLoop?
RunLoop란 입력 소스를 처리하는 이벤트 처리 루프로, 스레드가 작업이 없다면 쉬게 합니다.
Main Thread에서는 프레임워크가 자동으로 RunLoop을 설정하고 실행하지만
Global Thread는 사용자가 직접 RunLoop을 설정하고 실행해야 합니다 ㅎ
그래서 위의 예제에서 RunLoop을 직접 실행시켜주었습니다.
RunLoop에 대해서는 다음 포스팅에 자세히 다루도록 하겠습니다.
반응형
'Language > Swift' 카테고리의 다른 글
Swift GCD(Grand Central Dispatch) [5] - Group, WorkItem (0) | 2021.03.23 |
---|---|
Swift GCD(Grand Central Dispatch) [4] - RunLoop 실행과 종료 (0) | 2021.03.23 |
Swift GCD(Grand Central Dispatch) [2] - DispatchQueue (0) | 2021.03.22 |
Swift GCD(Grand Central Dispatch) [1] - 멀티스레딩 기초 (0) | 2021.03.22 |
Swift 서브스크립트 (Subscripts) (0) | 2021.03.21 |