새소식

iOS/SwiftUI

[SwiftUI] Task and .task in Swift - 2

  • -

[참고 영상]

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에서 권장하는 방식은 아니기에 있다고만 알고 꼭 필요할 때가 아니면 사용하지는 말자.


 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.