관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 2. Async, Await 간단 사용 정리 (Concurrency) - 동시 처리 (async let) 본문

iOS 응용 (swift)

[iOS - swift] 2. Async, Await 간단 사용 정리 (Concurrency) - 동시 처리 (async let)

jake-kim 2023. 10. 4. 01:24

1. Async, Await 간단 사용 정리 (Concurrency) - 사용 방법

2. Async, Await 간단 사용 정리 (Concurrency) - 동시 처리

 

* 해당 글에서는 간단한 사용법만 살펴보기 때문에, 개념적인 부분은 이전 포스팅 글 참고

동시 처리

  • Async, Await를 사용하면 비동기 작업을 completion 클로저 블록 없이 한줄로 처리가 가능
let imageUrlString = "https://images.dog.ceo/breeds/australian-shepherd/pepper.jpg"
guard let url = URL(string: imageUrlString) else { return }
Task {
    let image = try await loadImage(url: url)
}
  • 코드상으로는 image를 불러오기를 기다리며 await 하위 부분은 실행이 되지 않고 기다리는 상태
let image = try await loadImage(url: url)
// wait for a loading image...
  • 만약 여러 이미지를 불러오는 경우?
    • 순차적으로 image1이 다 불러와야 image2가 불러오므로 특정 이미지가 늦게 불러오게되면 그만큼 기다리는 상태
let image1 = try await loadImage(url: url)
// wait for loading image...
let image2 = try await loadImage(url: url)
let image3 = try await loadImage(url: url)
let image4 = try await loadImage(url: url)
  • image1, image2, image3, image4를 모두 동시에 불러오는 방법?
    • async let 키워드를 사용하여 호출할 async 함수들을 프로퍼티로 만들고, await 배열로 묶어서 호출하면 동시에 호출이 가능
func imagesForConcurrency() async throws -> [UIImage] {
    let imageUrlString = "https://images.dog.ceo/breeds/australian-shepherd/pepper.jpg"
    guard let url = URL(string: imageUrlString) else { return [] }
    
    async let first = loadImage(url: url)
    // no wait for loading image
    async let second = loadImage(url: url)
    async let third = loadImage(url: url)
    return try await [first, second, third]
}

* 전체 코드: https://github.com/JK0369/ExAsyncAwait_1

 

* 참고

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/concurrency/#Tasks-and-Task-Groups

https://dog.ceo/dog-api/

 

Comments