홍로그

Swift Async/Await 본문

iOS

Swift Async/Await

성홍민 2023. 5. 28. 12:03

Async/Await란?

Async/await는 비동기 작업을 보다 직관적이고 동기적인 코드와 유사한 구문으로 작성할 수 있게 해주는 Swift의 기능이다. 기존의 콜백(Callback) 기반 비동기 코드와 비교하여 가독성을 향상하고 오류 처리를 간소화하는 장점이 있다.

Async 함수 정의하기

async 함수는 비동기 작업을 수행하는 함수다. 함수 선언 앞에 async 키워드를 붙여서 표시하고 함수 내에서 await 키워드를 사용하여 비동기 작업의 결과를 기다릴 수 있다.

func fetchData() async throws -> Data {
    // 비동기 작업을 수행하는 코드
    // 작업이 완료되면 결과를 반환하거나 오류를 던집니다.
}

 
위의 예제에서 fetchData 함수는 비동기적으로 데이터를 가져오는 작업을 수행한다. async 키워드로 함수가 비동기임을 나타내고, throws 키워드로 함수가 오류를 던질 수 있음을 나타낸다. 데이터를 가져오는 비동기 작업이 완료되면 Data 형식의 결과를 반환하거나 오류를 던진다.

Await 키워드 사용하기

await 키워드는 비동기 작업이 완료될 때까지 현재 실행 흐름을 일시 중단한다. 이는 비동기 작업의 결과를 기다릴 수 있게 해주는 역할을 한다. await는 async 함수 내에서만 사용할 수 있다.

let data = await fetchData()
// fetchData가 완료되기 전까지 실행이 멈추고 결과를 반환받습니다.

 
위의 예제에서 await 키워드는 fetchData() 함수의 작업이 완료될 때까지 실행을 일시 중단한다. 작업이 완료되면 결과를 data 상수에 할당한다.

예외 처리하기

비동기 함수에서 발생하는 오류는 throws 키워드를 사용하여 처리할 수 있다. 오류를 던질 수 있는 함수를 호출할 때는 try 키워드와 await를 함께 사용해야 한다.

do {
    let data = try await fetchData()
    // fetchData가 완료되기 전까지 실행이 멈추고 결과를 반환받습니다.
    // 오류가 발생하면 catch 블록으로 이동합니다.
} catch {
    // 오류 처리 코드
}

위의 예제에서 fetchData() 함수 호출은 try await로 묶여 있다. 함수가 완료될 때까지 실행이 멈추고, 오류가 발생하면 catch 블록으로 이동하여 오류를 처리한다.

외부 API 호출 예시

아래의 코드는 네트워크를 통해 데이터를 비동기적으로 가져오는 함수다.

import Foundation

func fetchDataFromAPI() async throws -> [String: Any] {
    let url = URL(string: "https://api.example.com/data")!
    let (data, _) = try await URLSession.shared.data(from: url)
    return try JSONSerialization.jsonObject(with: data) as! [String: Any]
}

 
위의 예시에서 URLSession.shared.data(from:) 메서드를 사용하여 네트워크 요청을 비동기적으로 보낸다. await를 사용하여 요청이 완료될 때까지 대기하고, data를 반환한다. 그리고 JSONSerialization.jsonObject(with:) 메서드로 데이터를 JSON 형식으로 파싱 하여 반환한다.
이렇게 async/await를 사용하면 비동기 작업을 보다 쉽게 처리할 수 있다. 코드의 가독성을 향상시키고, 콜백 헬(callback hell)을 피할 수 있다.

반응형

'iOS' 카테고리의 다른 글

MVVM 패턴  (0) 2023.05.31
Combine vs Async/Await  (0) 2023.05.29
Swift Combine  (0) 2023.05.27
inout / mutating  (2) 2023.05.26
Swift final을 쓰는 이유  (0) 2022.11.01