
// 기존 completionHandler 패턴
URLSession.shared.dataTask(with: url) { data, response, error in
if let data = data {
// 데이터를 성공적으로 받았을 경우의 처리
} else if let error = error {
// 요청 중에 에러가 발생했을 경우의 처리
} else {
// 다른 상황일 경우의 처리
}
}
.resume()
continuation을 사용하여 비동기 작업이 완료될 때까지 대기한 후 해당 결과를 반환하거나 오류를 발생시킨다.오류를 던지는 처리라면
withCheckedThrowingContinuation혹은withUnsafeThrowingContinuation을 사용한다.
Continuation 내 전체 실행에서
continuation은 정확하게 딱 한 번만resume되어야 한다.
class ContinuationNetworkManager {
func getDataAsync(url: URL) async throws -> Data {
// async/await 패턴으로 변환
return try await withCheckedThrowingContinuation { continuation in
// 기존 비동기 처리
URLSession.shared.dataTask(with: url) { data, response, error in
if let data = data {
// 결과 반환
continuation.resume(returning: data)
} else if let error = error {
// 오류 반환
continuation.resume(throwing: error)
} else {
// 오류 반환
continuation.resume(throwing: URLError(.badURL))
}
}
.resume()
}
}
}
class ContinuationViewModel: ObservableObject {
@Published var image: UIImage? = nil
let networkManager = ContinuationNetworkManager()
func getImage() async {
guard let url = URL(string: "https://picsum.photos/200") else { return }
do {
// async/await 패턴으로 사용
let data = try await networkManager.getDataAsync(url: url)
if let image = UIImage(data: data) {
await MainActor.run(body: {
self.image = image
})
}
} catch {
print(error)
}
}
}