SC #4: async/await 구문
Source: Dev.to
async/await 함수 선언
비동기 함수는 async 키워드로 표시해야 합니다.
함수가 오류를 발생시킬 수 있으면 async 뒤에 throws 키워드를 추가합니다.
함수가 오류를 발생시키지 않으면 throws를 생략할 수 있습니다.
func fetchData() async throws -> Data {
// …
// ❌ 컴파일 오류: 값을 반환하거나 오류를 발생시켜야 합니다
}
async throws 구문을 사용할 때 함수는 항상 값을 반환하거나 오류를 발생시켜야 합니다.
클로저 사용
클로저를 사용할 때 호출을 잊어버리기 쉬운데, 이는 논리 오류를 일으킵니다(예: 오류를 알리지 않거나 값을 반환하지 않음).
func fetchData(_ completion: @escaping (Data?, Error?) -> Void) {
// `completion(_: )` 블록을 호출하지 않음, 이는 오류가 됩니다
}
Task 로 동기 컨텍스트에서 async 코드 실행
Task는 동기 컨텍스트 안에 비동기 컨텍스트를 생성하여, 동시성을 지원하지 않는 함수에서도 async 메서드를 호출할 수 있게 합니다.
Task {
try await fetchData()
}
Task를 사용하지 않으면 다음과 같은 오류가 발생합니다:
'async' call in a function that does not support concurrency
핵심 개념
- async: 함수가 비동기 작업을 수행함을 나타냅니다.
- await: 비동기 함수가 완료될 때까지 실행을 일시 중지합니다.
- throws: 오류를 전파합니다.