[TIL] Task

박주하·2025년 7월 23일

Task


  • 비동기 작업을 병렬로 수행하기 위한 가상의 "작업 스레드"
  • 즉, 비동기 작업을 캡슐화하는 객체
  • async/await는 비동기 코드를 간단하고 가독성 있게 만들 수 있도록 도와주는데, 앱 실행 중에 어떤 비동기 작업을 새로 시작하고 싶을 때 쓰는 게 바로 Task
  • 예: 네트워크 요청, 파일 다운로드, API 호출, 백그라운드 계산

특징

// 비동기 함수
func fetchWeatherAsync() async -> String {
    return "맑음"
}

// 비동기 함수는 Task 안에서 실행해야 함
Task {
    let result = await fetchWeatherAsync()
    print("오늘 날씨: \(result)")
}
  • async 함수 실행 가능: await 키워드와 함께 사용 가능
  • 자동으로 병렬 실행: 기존 코드 흐름을 막지 않음
  • Task.cancel(): 작업 취소 요청
  • Task.isCancelled: 현재 Task가 취소되었는지 확인
  • Task.sleep(_:): 일정 시간 동안 작업을 지연시킴
  • Task.priority: 우선순위 설정 (.userInitiated, .background 등)

예제

1. 우선순위

Task(priority: .userInitiated) {
    let data = await loadData()
    print(data)
}
우선순위설명
.background중요도 낮은 작업 (ex. 캐시 생성)
.utility다운로드/처리 작업
.userInitiated사용자가 요청한 즉각적인 작업
.userInteractiveUI와 바로 연결된 빠른 작업

2. Task 안에서 취소 감지

Task {
    for i in 1...100 {
        if Task.isCancelled {
            print("작업 취소")
            return
        }
        print(i)
    }
}

3. Task 반환값 받기

let task = Task { () -> Int in
    return 5 * 2
}
let result = await task.value  // 10

Task의 종류

  • Task { }: 일반적인 비동기 작업 (Main/Background 쓰레드에서 실행 가능)
  • Task.detached { }: 독립적으로 실행 (자식 Task ❌, 전역 우선순위 사용)
  • TaskGroup: 여러 Task를 묶어서 실행하고 결과를 모음 (for loop 병렬 처리 등)

💡 왜 사용할까?

  • 기존의 GCD (DispatchQueue) 와 달리 async/await를 자연스럽게 사용할 수 있음
  • 구조화된 동시성 덕분에 Task 간의 의존 관계나 취소 처리 등이 명확해짐
  • UI 업데이트를 블로킹하지 않고 비동기 코드 작성이 간결해짐

0개의 댓글