[swift] 비동기 작업에 대한 타임아웃 설정 방법
비동기 작업을 수행할 때 종종 타임아웃을 설정해야 할 필요가 있습니다. 타임아웃을 설정하지 않으면 작업이 영구적으로 지연될 수 있고 애플리케이션의 성능에 영향을 줄 수 있습니다. 스위프트에서 비동기 작업에 타임아웃을 설정하는 방법에 대해 알아보겠습니다.
Dispatch Queue를 사용한 타임아웃 설정
Dispatch Queue를 사용하여 비동기 작업을 수행하는 경우, DispatchWorkItem
과 DispatchTime
을 활용하여 타임아웃을 설정할 수 있습니다. 아래는 그 예시입니다.
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 Queue
와 URLSession
을 활용하는 것이 일반적입니다. 작업의 특성에 맞게 적절한 방법을 선택하여 타임아웃을 설정하고, 애플리케이션의 성능을 유지하는 데 도움이 될 것입니다.
참고 자료: