Jupyo's Daily Story
Concurrency (async/await) 본문
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 |