async let 을 사용하면 시스템이 async let 오른쪽에 있는 비동기 함수를 병렬적으로 실행시킵니다
await를 사용할 때는 시스템이 해당 비동기 함수를 실행시킬 때마다 실행을 담당하는 스레드를 정지(suspend)했는데, async let 을 사용한 구문에서는 result가 필요하기 전까지 이후의 함수들을 계속 읽습니다.
코드로 예시를 확인해 보겠습니다.
다음은 인터넷으로부터 사진을 가져오는 비동기 작업을 수행하는 코드입니다.
func fetchImage() async throws -> UIImage {
do {
let (data, _) = try await URLSession.shared.data(from: url, delegate: nil)
if let image = UIImage(data: data) {
return image
} else {
throw URLError(.badURL)
}
} catch {
throw error
}
}
async let 사용하지 않는 경우
다음은 위에서 만든 코드를 사용하여 해당 값을 각 변수에 담는 것을 의미합니다, 하지만 이때 try await을 사용하게 된다면 image1 에 담긴 후 image2에 사진이 담겨지고 다음으로 image3에 담겨지게 되어 순서를 기다려야 합니다.
Task {
do {
let image1 = try await fetchImage()
self.images.append(image1)
let image2 = try await fetchImage()
self.images.append(image2)
let image3 = try await fetchImage()
self.images.append(image3)
let image4 = try await fetchImage()
self.images.append(image4)
} catch {
}
}
async let을 사용한다면
다음 코드를 통해 확인해보면 async let 을 사용하게 된다면 함수의 결과(fetchImage1, 2, 3, 4)가 필요하기 전까지 이후의 함수들을 계속하여 읽게 됩니다. (async let 을 사용하면 여러 비동기 작업을 병렬로 처리하기 때문)
이후 let (image1, Image2, 3, 4) = await (try fetchImage2, try 2, ...)를 통해서 병렬로 처리되는 모든 작업이 완료될 때까지 기다렸다가 image1, 2, 3, 4 에 이미지를 넣게 됩니다.
(즉 async let 은 비동기 함수를 병렬로 호출한 후 결과를 하나의 await으로 한번에 담아냅니다)
Task {
do {
async let fetchImage1 = fetchImage()
async let fetchImage2 = fetchImage()
async let fetchImage3 = fetchImage()
async let fetchImage4 = fetchImage()
// 하나의 await으르만 처리가능
let (image1, image2, image3, image4) = await (try fetchImage1, try fetchImage2, try fetchImage3, try fetchImage4)
self.images.append(contentsOf: [image1, image2, image3, image4])
} catch {
}
}
요약
즉 async let 은 작업들을 병렬적으로 여러개 호출한 다음 await으로 해당 작업들을 기다렸다 한꺼번에 처리할 수 있게 해줍니다.
전체 코드
https://github.com/iOS-Developer-KR/SwiftUIRepository2/tree/main/AsyncLetExample
'SwiftUI' 카테고리의 다른 글
Struct 구조체 (0) | 2024.05.18 |
---|---|
Subscripts (0) | 2024.05.17 |
Chat GPT API 사용하기 (3) | 2024.05.15 |
공공 데이터 지도에 띄우기 (with 네이버 지도) (0) | 2024.05.13 |
custom error (0) | 2024.05.11 |