[Concurrency] async-await-3
1. 에러 처리
-
에러를 던지는 비동기 함수 정의
-
에러를 던질 수 있는 비동기함수 실행시 try await
-
async 다음에 throws가 와야한다.
-
try 다음에 await이 와야한다.
// 1 func throwingGetImage() async throws -> UIImage? { // 오래 걸리는 일.., 에러가 던질 수 있는 코드 try await Task.sleep(for: .seconds(2)) return UIImage(systemName: "heart") } // 에러를 던질 수 있는 비동기 함수 정의 func asyncMethod() async throws -> String { let result = try await otherMethod() return result } // 원칙적 방법 Task { do { let totalString = try await asyncMethod() print(totalString) } catch { } } let task = Task { // 1. asyncMethod는 비동기 함수라서 await 붙혀준다 // 2. 에러를 던질 수 있으므로 try 키워드를 붙혀준다 // 3. 원칙적 처리로는 do-catch가 맞지만 처리하지 않아도 된다 // 이유: Task 자체가 에러를 던질 수 있다 let result = try await asyncMethod() print(result) } Task { await task.result }
2. 비동기 함수 실행방법 2가지
-
(1) Task 안에서 async 함수 호출
Task { let image = await getImage() }
-
(2) 다른 async 함수 안에서 async 함수 호출 가능(비동기 컨텍스트)
func getImages() async -> [UIImage?] { let image1 = await getImage() let image2 = await getImage() let image3 = await getImage() return [image1, image2, image3] } Task { let images = await getImages() }
3. 언제든지 비동기적인 컨텍스트 만드는 것 가능
-
비동기함수는 비동기적인 컨텍스트에서 호출되야한다
func someSyncFunc() { print("동기적인 작업 시작") Task { try await Task.sleep(for: .seconds(2)) print("비동기적인 작업내에서의 작업") } print("동기함수 작업 종료") }
4. 비동기 함수 내에서 비동기 함수 호출
- 각각의 함수 자체가 중간에 멈췄다가 다시 실행할 수 있다.
- 순서대로 진행된다.
- 비동기 함수 내에서 다른 비동기 함수를 호출을 하는것은 현재의 실행 컨텍스트 내에서 실행을 시키는 것이다(취소 전파도 가능하고, 하위 작업을 만드는 것이 아니다).
-
즉 구조적 동시성이 아니다.
func parentFuncgion() async throws { // async 함수 내에서 다른 async 함수 호출: 동일한 비동기 컨텍스트 내에서의 실행(작업의 입루) try await asyncFunction() try await asyncFunction() // Task를 사용하여 명시적으로 다른 작업(Task) 생성 가능(구조적 동시성은 아니고 따로 작업을 만든다) 병렬 실행 // 자식 작업의 생성 방식은 아니다 Task { try await asyncParentFunction() try await asyncParentFunction() } print("비동기 함수 실행의 종료") }
-
Leave a comment