apple/Docs, iOS, Swift
Swift @TaskLocal
lgvv
2024. 8. 28. 01:24
Swift @TaskLocal
- TaskLocal 값은 Task의 컨텍스트 내에서 바인딩되고 읽을 수 있는 값
- Task와 함께 암묵적으로 전달되며, TaskGroup이나 `async let`으로 생성된 하위 Task에서도 접근할 수 있음
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
데이터를 넣어주고 싶을 경우에는 아래 형태로 사용.
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