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

 

SwiftUIRepository2/AsyncLetExample at main · iOS-Developer-KR/SwiftUIRepository2

Contribute to iOS-Developer-KR/SwiftUIRepository2 development by creating an account on GitHub.

github.com

 

'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
ytw_developer