apple/Docs, iOS, Swift

Swift @TaskLocal

lgvv 2024. 8. 28. 01:24

Swift @TaskLocal

- TaskLocal 값은 Task의 컨텍스트 내에서 바인딩되고 읽을 수 있는 값

- Task와 함께 암묵적으로 전달되며, TaskGroup이나 `async let`으로 생성된 하위 Task에서도 접근할 수 있음

 

 

TaskLocal

 

 

 

TaskLocal 선언하기

enum Example {
    @TaskLocal
    static let traceID: TraceID?
}


// Global task local properties are supported since Swift 6.0:
@TaskLocal
var contextualNumber: Int = 12

 

Swift 6.0부터 global로 사용 가능함.

global에 대해서 더 자세히 알고 싶다면 댓글(간략정리) 혹은 아래 포스팅 참고.
https://rldd.tistory.com/612

 

[WWDC24] Swift의 성능 살펴보기

[WWDC24] Swift의 성능 살펴보기Swift의 Low-level에 대해서 알아볼 예정 Introduce- What is performance?: 성능이란?- Low-level principles: Low-level의 성능을 볼 때 고려해야 할 원칙- Putting it together: Swift의 어떻게

rldd.tistory.com

 

 

get-only라서 이렇게 할당 불가능.

 

 

데이터를 넣어주고 싶을 경우에는 아래 형태로 사용.

TaskLocalExample.$traceID.withValue("음악가게") { 
   ... 
}

 

 

아래 코드를 살펴보면서 TaskLocal 이해하기

우선 아래 코드의 결과가 어떻게 나올지 추측해보기.

정답은 내려서 확인 가능.

 

func swift5_10() {
        TaskLocalExample.traceID = "음악"
        
        print("✅ 1: ",TaskLocalExample.traceID)
        
        TaskLocalExample.$traceID.withValue("음악가게") {
            print("✅ 2: ", TaskLocalExample.traceID)
            
            Task {
                print("✅ 3: ", TaskLocalExample.traceID)
                
                Task {
                    print("✅ 4: ", TaskLocalExample.traceID)
                }
                
                Task.detached {
                    print("✅ 5: ", TaskLocalExample.traceID)
                }
            }
        }
        
        print("✅ 6: ",TaskLocalExample.traceID)
        
        Task {
            print("✅ 7: ",TaskLocalExample.traceID)
        }
    }

 

 

 

 

아래 코드를 살펴보면서 TaskLocal 이해하기 (정답)

 

 

 

 

정답

 

 

 

왜 이렇게 정답이 나오는지 분석

  • 1번: 아직 할당된 값이 없어서 nil
  • 2번: withValue에 값이 할당되어서 Optional("음악가게")
  • 3번: 구조화된 동시성의 내부의 Task이므로 Optional("음악가게")
  • 4번: 구조화된 동시성의 내부의 Task이므로 Optional("음악가게")
  • 5번: detached로 되어 있어서 부모와 격리 되므로 nil
  • 6번: withValue의 범위를 벗어났으므로 nil
  • 7번: withValue의 범위를 벗어났으므로 nil

순서: Task의 순서는 보장되지 않음. 그래도 흐름은 어느정도 보장

 

 

 

 

 

 

(참고)

https://developer.apple.com/documentation/swift/tasklocal

 

TaskLocal | Apple Developer Documentation

Wrapper type that defines a task-local value key.

developer.apple.com