-
Notifications
You must be signed in to change notification settings - Fork 0
Task (작업) #3
Copy link
Copy link
Open
Labels
Description
Task (작업)
- 비동기적인 일처리를 할 수 있는 하나의 작업 단위
- 생성 시 즉시 비동기 실행 시작
- 내부는 순차 실행, Task 간에는 병렬 실행 가능
// Task 생성 → 즉시 비동기 실행
let task = Task {
print("시작")
try await Task.sleep(for: .seconds(1)) // 중단 후 재개
print("완료")
}
// 동기 코드
print("메인 실행")
메인 실행
시작
(1초 대기)
완료우선순위
- userInitiated, high, medium, low, utility, background
- 시스템 힌트 정도로만 작동 (엄격하지 않음)
작업 취소
task.cancel()호출로 협력적 취소- 취소 여부는
Task.isCancelled또는Task.checkCancellation()로 확인
결과 처리
- Task 작업의 결과로 반환 값 리턴 가능
task.value→ 성공 결과 직접 접근task.result→ Result 타입으로 접근 가능
Context (코드가 실행되는 환경)
실행 컨텍스트 (Execution Context)
- 지금 코드가 어떤 환경 (스레드, 액터 등) 안에서 실행되는지
-
동기 컨텍스트: 일반 함수 내부,
main()같은 동기 코드 실행 환경 -
비동기 컨텍스트:
async함수 내부,await가 허용되는 실행 환경
-
동기 컨텍스트에서 비동기 실행
Task { .. }-> 함수 내부에서async작업 가능-
동기 함수에서는
await를 직접 쓸 수 없지만, -
Task { .. }로 새로운 비동기 실행 컨텍스트를 만들어주면 가능
-
/// (동기적인 맥락에서) 비동기적인 작업을 만들어서 실행시키는 것도 가능
func doSomething() {
print("동기 실행 1")
Task {
print("Task 실행")
}
print("동기 실행 2")
}
동기 실행 1
동기 실행 2
Task 실행- Task가 항상 마지막에 실행된다는 보장은 없음 -> Task는 번호표 뽑고 기다리는 상황 (실행 예약)
-
Task { .. }가 만들어진 시점에 '비동기 큐'에 등록됨 → 런타임이 스케줄링한 시점에 실행 -
보통은 동기 코드 끝난 뒤 실행되지만, 정확한 타이밍 보장 X
-
코드 작성 순서가 아닌, 시스템이 스케줄링해서 실행되는 시점에 돌게 됨 (시스템이 정함)
-
GCD의
DispatchQueue.async와 동일하게 예약 실행 방식 -> 실행 시점은 큐/런타임 스케줄러가 관리
-
Task 컨텍스트
- Task는 생성될 때, 부모 컨텍스트의 메타데이터(우선순위, 실행 액터, Task-Local 변수)를 상속받음
- 취소는 상속되지 않음
- 독립 실행은
Task.detached사용 (권장 X, 필요할 때만)
메모리 관리
- Task 클로저는 자동으로 self를 안전하게 캡쳐
- ->
weak self불필요 (Task closure lifeTime공식 문서) - 작업 종료 시 캡처된 참조도 해체됨
SwiftUI task modifier
.onAppear- 기본 동기 컨텍스트 (
async필요 시Task로 감싸야 함)
- 기본 동기 컨텍스트 (
.onAppear {
Task { image
// 비동기적인 작업 처리
image = await fetchImages()
}
}.task- 뷰 수명과 동일한 비동기 컨텍스트 제공, 뷰 사라지면 자동 취소
- 화면이 나타날 때, 비동기적인 작업을 수행하고 싶다면
.onAppear대신.task로 수행
Reactions are currently unavailable