async/await는 Swift 5.5에서 새롭게 도입된 비동기 프로그래밍 패턴입니다. 비동기 프로그래밍은 대개 긴 작업을 수행할 때 유용하며, 이를 통해 앱의 반응성을 높이고 멀티태스킹을 효과적으로 처리할 수 있습니다. async/await는 비동기 코드를 작성하고 호출하는 방법을 단순화하며, 콜백 기반의 비동기 프로그래밍에서 발생하는 복잡성을 줄여줍니다.
async는 비동기 함수를 선언할 때 사용되며, await는 비동기 함수가 반환될 때까지 현재 스레드의 실행을 일시 중지합니다. 예를 들어, 다음과 같은 함수가 있다고 가정해 봅시다.
func fetchUserData(completion: @escaping (Result<User, Error>) -> Void) {
// 네트워크를 통해 사용자 데이터를 가져오는 긴 작업
// 작업이 완료되면 completion 핸들러를 호출하고 결과를 반환합니다.
}
이 함수를 비동기 함수로 변환하려면 async를 사용하여 함수 선언을 수정해야 합니다.
func fetchUserData() async throws -> User {
// 네트워크를 통해 사용자 데이터를 가져오는 긴 작업
// 결과를 반환합니다.
}
async 키워드를 추가하면 함수가 비동기 함수임을 나타내며, throws를 사용하여 오류 처리를 추가할 수 있습니다.
이제 fetchUserData()를 호출하고 결과를 기다리려면 await를 사용해야 합니다.
do {
let user = try await fetchUserData()
print("User: \(user)")
} catch {
print("Error: \(error)")
}
await를 사용하여 fetchUserData()가 완료될 때까지 기다리고, 결과를 처리합니다. 이전의 콜백 기반 방식에서는 이를 수행하기 위해 복잡한 콜백 체인이 필요했습니다.
다른 예제로, 비동기 함수에서 여러 개의 값을 반환하는 경우 async와 await를 사용하여 처리할 수 있습니다.
func fetchData() async -> (String, Int) {
// 비동기 데이터 가져오기
// 문자열과 정수를 반환합니다.
}
async {
let (name, age) = await fetchData()
print("Name: \(name), Age: \(age)")
}
fetchData() 함수가 문자열과 정수를 반환하므로 await를 사용하여 반환 값을 변수에 바인딩할 수 있습니다.
Swift 5.5 이상에서는 async/await를 사용할 수 있습니다. Xcode 13 또는 이후 버전에서 사용할 수 있으며, iOS 15 이상에서 실행됩니다.
http 통신에서 async/await 사용
async/await를 HTTP와 연관지어 설명하면, HTTP 요청을 보내는 것은 일반적으로 비동기 작업입니다. HTTP 요청을 보내고 서버에서 응답을 받을 때까지 앱의 다른 부분은 계속 실행됩니다. 그러나 응답을 받을 때까지 기다리지 않고 다른 작업을 수행하면서 비동기적으로 작업을 수행하려면 async/await를 사용할 수 있습니다.
예를 들어, 다음과 같은 함수가 있다고 가정해 봅시다.
func fetchUserData(completion: @escaping (Result<User, Error>) -> Void) {
let url = URL(string: "https://example.com/userdata")!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
// 데이터를 처리하고 결과를 반환하는 작업
}
task.resume()
}
이 함수는 HTTP 요청을 보내고 데이터를 처리하기 위해 콜백 함수를 사용합니다. 이를 async/await를 사용하여 변환하면 다음과 같습니다.
func fetchUserData() async throws -> User {
let url = URL(string: "https://example.com/userdata")!
let (data, response) = try await URLSession.shared.data(for: URLRequest(url: url))
// 데이터를 처리하고 결과를 반환하는 작업
}
async와 await를 사용하여 비동기 함수를 작성하면, HTTP 요청을 보내고 서버에서 응답을 받을 때까지 기다리는 것이 아니라, 다른 작업을 수행하면서 비동기적으로 요청을 보내고 응답을 받을 수 있습니다. 이를 통해 앱의 반응성을 향상시키고, 긴 작업을 처리하면서도 UI 스레드를 차단하지 않습니다.
또한, URLSession에서 async/await를 사용하면 콜백 함수 대신에 try await URLSession.shared.data(for: URLRequest(url: url))와 같은 코드로 데이터를 쉽게 가져올 수 있습니다. 이를 통해 코드의 가독성이 향상되며, 콜백 함수를 처리하는 복잡성도 줄어듭니다.
댓글