Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

Jupyo's Daily Story

Concurrency (async/await) 본문

Swift

Concurrency (async/await)

JangJupyo 2024. 9. 26. 12:09
728x90
반응형

async/await는 비동기 코드의 가독성과 관리성을 높여주는 Swift의 중요한 기능입니다. 이 구조는 콜백 지옥을 해결하고, 동기 코드처럼 작성할 수 있어 비동기 흐름을 단순화합니다.

 

async 함수 정의

비동기 함수를 선언할 때 async 키워드를 사용합니다. 이 함수는 비동기 작업을 포함하여, 호출할 때 비동기적으로 처리됩니다.

func fetchUserData() async -> String {
    // 서버에서 사용자 데이터를 가져오는 비동기 작업
    return "User Data"
}

 

await로 비동기 작업 기다리기

await 키워드를 사용하여 비동기 함수가 완료될 때까지 기다릴 수 있습니다. 이는 비동기 작업이 완료된 후 다음 코드를 실행할 수 있도록 해줍니다.

let userData = await fetchUserData()
print(userData)

 

async/await 의 장점

  • 코드의 직관성: 콜백 기반 코드에 비해 읽고 쓰기 더 쉽습니다.
  • 에러 처리: 비동기 작업 내에서 do-catch 구문으로 에러를 동기 함수처럼 처리할 수 있습니다.

 

비동기 함수 호출 예시

비동기 함수가 다른 비동기 함수를 호출하는 경우, 여러 작업을 순차적으로 처리할 수 있습니다.

func fetchUserProfile() async -> String {
    let userData = await fetchUserData()
    let userProfile = await fetchProfilePicture()
    return "\(userData) with \(userProfile)"
}

 

에러 처리와 async/await 사용

비동기 함수에서 발생하는 에러는 do-catch 구문을 통해 처리할 수 있습니다. 예를 들어, 서버에서 데이터를 받아오다가 에러가 발생하면 이를 처리하는 방식입니다.

func downloadImage() async throws -> UIImage {
    // 네트워크로부터 이미지를 받아오는 비동기 작업
}

do {
    let image = try await downloadImage()
    print("이미지 다운로드 성공")
} catch {
    print("다운로드 실패: \(error)")
}

 

Task 및 TaskGroup

비동기 작업을 Task로 감싸서 사용할 수 있으며, 이를 통해 명시적으로 비동기 작업을 실행할 수 있습니다. TaskGroup은 여러 비동기 작업을 동시에 처리할 수 있게 도와줍니다.

Task {
    await fetchUserData()
}
func processMultipleTasks() async {
    await withTaskGroup(of: String.self) { group in
        group.addTask {
            return await fetchUserData()
        }
        group.addTask {
            return await fetchProfilePicture()
        }
        
        for await result in group {
            print(result)   // 여러 비동기 작업 결과 출력
        }
    }
}

 

async/await는 Swift의 비동기 처리 방식을 동기처럼 간단하게 작성할 수 있도록 도와주는 강력한 도구입니다. 이를 통해 비동기 코드의 복잡성을 줄이고, 가독성을 높이며, 에러 처리도 더 직관적으로 처리할 수 있습니다. TaskGroup을 사용하여 여러 작업을 동시에 처리할 수 있는 장점도 있어 앱 성능을 향상 시키는 데 큰 도움이 됩니다.

반응형

'Swift' 카테고리의 다른 글

Codable  (0) 2024.09.30
OperationQueue  (0) 2024.09.26
GCD (Grand Central Dispatch)  (1) 2024.09.25
튜플 (Tuples)  (0) 2024.09.25
Announcing Swift 6  (2) 2024.09.23