Skip to content

Task (작업) #3

@camosss

Description

@camosss

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로 수행

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions