[swift] 비동기 작업에 대한 타임아웃 설정 방법

비동기 작업을 수행할 때 종종 타임아웃을 설정해야 할 필요가 있습니다. 타임아웃을 설정하지 않으면 작업이 영구적으로 지연될 수 있고 애플리케이션의 성능에 영향을 줄 수 있습니다. 스위프트에서 비동기 작업에 타임아웃을 설정하는 방법에 대해 알아보겠습니다.

Dispatch Queue를 사용한 타임아웃 설정

Dispatch Queue를 사용하여 비동기 작업을 수행하는 경우, DispatchWorkItemDispatchTime을 활용하여 타임아웃을 설정할 수 있습니다. 아래는 그 예시입니다.

import Dispatch

let workItem = DispatchWorkItem {
    // 비동기 작업 수행
}

let timeoutInSeconds: DispatchTimeInterval = .seconds(10)
let result = DispatchQueue.global().asyncAfter(deadline: .now() + timeoutInSeconds, execute: {
    // 타임아웃 발생 시 처리할 작업
})

DispatchQueue.global().async(execute: workItem)
DispatchQueue.global().asyncAfter(deadline: .now() + timeoutInSeconds, execute: {
    workItem.cancel()
})

위 코드에서 DispatchTimeInterval을 사용하여 타임아웃을 초 단위로 설정하고, DispatchQueue.global().asyncAfter를 사용하여 타임아웃을 처리할 때 workItem을 취소할 수 있습니다.

URLSession을 사용한 타임아웃 설정

네트워크 요청과 같은 작업을 수행할 때는 URLSession을 사용하여 타임아웃을 설정할 수 있습니다. 아래는 URLSession을 사용한 타임아웃 설정 예시입니다.

let url = URL(string: "https://example.com")!
let request = URLRequest(url: url)
let timeoutInterval: TimeInterval = 10

let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
    // 네트워크 작업 완료 후 처리
}

task.resume()

DispatchQueue.global().asyncAfter(deadline: .now() + timeoutInterval) {
    if task.state == .running {
        task.cancel()
        print("Request timed out")
    }
}

위 코드에서 URLSession.shared.dataTask(with: request)를 사용하여 네트워크 작업을 수행하고, DispatchQueue.global().asyncAfter를 사용하여 타임아웃을 처리합니다.

결론

스위프트에서 비동기 작업에 타임아웃을 설정하는 방법은 Dispatch QueueURLSession을 활용하는 것이 일반적입니다. 작업의 특성에 맞게 적절한 방법을 선택하여 타임아웃을 설정하고, 애플리케이션의 성능을 유지하는 데 도움이 될 것입니다.

참고 자료: