[참고 영상]
https://youtu.be/fTtaEYo14jI
[학습 목표]
저번시간에는 Task란 무엇인지에 대해서 배워봤다.
이번시간에는 Task는 그렇다면 똑같이 동기화되어서 실행되는지 혹은 먼저 실행시키고 싶은 Task가 있다면 어떻게 해야 하는지에 대해서 배워보자.
[구현 방법]
Task의 경우에는 synchronous코드 이기 때문에 await이 asynchronous코드라고 하더라도 await의 완료를 기다리지 않고 위에 있는 Task가 실행 된 바로 다음에 다음 Task를 실행하기 때문이다.
이와 같은 Task에도 우선 순위가 있다.
Task(priority: .high) {
print("high : \(Thread.current) : \(Task.currentPriority)")
}
Task(priority: .userInitiated) {
print("userInitiated : \(Thread.current) : \(Task.currentPriority)")
}
Task(priority: .medium) {
print("medium : \(Thread.current) : \(Task.currentPriority)")
}
Task(priority: .low) {
print("Low : \(Thread.current) : \(Task.currentPriority)")
}
Task(priority: .background) {
print("background : \(Thread.current) : \(Task.currentPriority)")
}
Task(priority: .utility) {
print("utility : \(Thread.current) : \(Task.currentPriority)")
}
high / userInitiated / medium / low / background / utility 등의 우선순위로 인하여 같은 Thread에서 우선순위의 차이로 인하여 먼저 실행되는 것이 달라지는 것을 알 수가 있다.
Task 내부에 Task 쓰기
Task(priority: .userInitiated) {
print("userInitiated : \(Thread.current) : \(Task.currentPriority)")
Task{
print("userInitiated2 : \(Thread.current) : \(Task.currentPriority)")
}
}
이와 같은 코드를 사용했을 때 과연 우선순위는 어떻게 될까? Task 안에 Task이니 둘의 우선순위는 과연 같을 것인가?
결과적으로 둘이 같은 쓰레드에서 같은 우선순위를 가지고 있다는 것을 알 수가 있다.
그렇다면 내부 Task의 우선순위는 외부 Task를 따라 가는 것일까? 내부 Task에 한번 우선순위를 지정해서 확인해보자.
Task(priority: .userInitiated) {
print("userInitiated : \(Thread.current) : \(Task.currentPriority)")
Task(priority: .high){
print("high : \(Thread.current) : \(Task.currentPriority)")
}
}
해당 함수를 통해서 우리들은 내부 Task는 해당 Task 밖의 외부 Task의 우선순위를 따라 간다는 것을 알 수가 있다.
이와 같은 우선순위에 대해서 바꾸고 싶다면 어떻게 해야 할까?
Task.detached()
.detached() 함수를 사용해보자.
Task(priority: .userInitiated) {
print("userInitiated : \(Thread.current) : \(Task.currentPriority)")
Task.detached(){
print("high : \(Thread.current) : \(Task.currentPriority)")
}
}
결과적으로 detached를 사용하면 외부 Task와 우선순위가 바뀐다는 것을 알 수가 있다.
하지만 이와 같은 방법은 Apple에서 권장하는 방식은 아니기에 있다고만 알고 꼭 필요할 때가 아니면 사용하지는 말자.