IOS개발: SWIFT/8. 심화 주제 및 추가 학습

Swift Concurrency: Task와 async/await

_Blue_Sky_ 2024. 9. 19. 14:48
728x90
728x90

Swift 5.5부터 도입된 Concurrency는 비동기 프로그래밍을 더욱 안전하고 효율적으로 처리할 수 있도록 지원하는 강력한 기능입니다. 특히, Task와 async/await 키워드는 이러한 Concurrency 모델의 중심을 이루며, 복잡한 비동기 작업을 보다 직관적으로 처리할 수 있도록 돕습니다.

Task: 비동기 작업의 단위

Task는 비동기 작업을 실행하고 관리하는 최소 단위입니다. 하나의 Task는 하나의 비동기 작업을 나타내며, 이 작업은 메인 스레드를 차단하지 않고 백그라운드에서 실행됩니다. Task를 사용하면 다음과 같은 작업을 수행할 수 있습니다.

  • 비동기 함수 호출: async/await 키워드를 사용하여 비동기 함수를 호출하고, 그 결과를 기다릴 수 있습니다.
  • 병렬 처리: 여러 Task를 동시에 실행하여 병렬 처리를 수행할 수 있습니다.
  • 취소: Task의 실행을 취소할 수 있습니다.
  • 에러 처리: Task 실행 중 발생하는 에러를 처리할 수 있습니다.

async/await: 비동기 코드의 동기적 표현

async/await 키워드는 비동기 코드를 마치 동기 코드처럼 작성할 수 있도록 해주는 강력한 기능입니다.

  • async: 함수 앞에 async 키워드를 붙이면 해당 함수는 비동기적으로 실행되는 함수가 됩니다. 이 함수는 Task를 반환하며, 다른 async 함수에서 호출될 수 있습니다.
  • await: async 함수 내에서 다른 async 함수를 호출할 때 await 키워드를 사용합니다. await 키워드는 해당 함수가 완료될 때까지 기다린 후에 다음 코드를 실행합니다.

예시: 이미지 다운로드하기

import UIKit

func downloadImage(from url: URL) async -> UIImage? {
    // 이미지 다운로드 로직
    return UIImage(data: try await Data(contentsOf: url))
}

func displayImage(image: UIImage?) {
    // 이미지를 화면에 표시하는 로직
}

Task {
    do {
        let image = try await downloadImage(from: someURL)
        await MainActor.run {
            displayImage(image)
        }
    } catch {
        // 에러 처리
    }
}
 

위 예시에서:

  • downloadImage 함수는 async 키워드를 사용하여 비동기적으로 이미지를 다운로드하는 함수입니다.
  • Task 블록에서 downloadImage 함수를 호출하고, await 키워드를 사용하여 결과를 기다립니다.
  • 다운로드된 이미지를 메인 스레드에서 화면에 표시하기 위해 MainActor.run 블록을 사용합니다.

Task 그룹

여러 개의 Task를 그룹으로 관리하여 동시에 실행하거나, 특정 조건이 만족될 때까지 기다릴 수 있습니다.

let tasks = [
    Task { ... },
    Task { ... },
    Task { ... }
]

let results = await Task.waitAll(tasks)

Task 취소

Task의 실행을 취소하려면 Task.cancel() 메서드를 호출합니다.

let task = Task { ... }
task.cancel()
 

주의 사항

  • 메인 스레드 차단 주의: 장시간 실행되는 작업은 항상 백그라운드 스레드에서 실행해야 합니다. 메인 스레드가 차단되면 UI가 멈춰 사용자 경험이 저하될 수 있습니다.
  • MainActor: UI 업데이트는 항상 메인 스레드에서 이루어져야 합니다. MainActor.run 블록을 사용하여 UI 업데이트를 안전하게 처리할 수 있습니다.
  • 에러 처리: 비동기 작업 중에 에러가 발생할 수 있으므로, do-catch 블록을 사용하여 에러를 적절히 처리해야 합니다.

결론

Swift Concurrency는 비동기 프로그래밍을 더욱 간편하고 안전하게 처리할 수 있도록 지원하는 강력한 기능입니다. Task와 async/await 키워드를 효과적으로 활용하여 복잡한 비동기 작업을 효율적으로 처리하고, 더욱 반응성이 뛰어난 앱을 개발할 수 있습니다.

728x90
728x90