https://developer.apple.com/videos/play/wwdc2021/10132/
네트워크 통신을 하는 `fetchThumbnail` 비동기 함수가 있습니다.
비동기 작업에 대한 결과를 `completion`으로 처리를 합니다.
`completion`는 클로저일 뿐 강제할 수 없습니다.
그래서 `guard let ~ else return` 구문을 사용하는데 너무 익숙해서 `completion`을 안쓰고 return해버릴 수도 있습니다.
위와 같이 completion 클로저가 중첩된 코드는 여러 스레드를 돌기때문 스레드 data race 관리 어렵고, 휴먼에러 발생 위험이 있습니다.
또한 실패, 성공에 대한 처리가 깔끔하지 못하죠.
그래서 Result를 사용할 수 있지만 completion 클로저를 사용해야 함에는 변함이 없습니다.
그래서 짱!! 편한 `async ~ await` 방식이 등장했습니다.
async await 를 쓰면 선형으로 동작하게 됩니다. 그리고 비동기 데이터를 return 할 수 있게 됩니다.
`URLSession.shared.data` 는 awaitable한 함수입니다.
`async throws` 키워드로 비동기 함수를 선언하고
`try await`를 실제로 비동기를 쓸 부분에 붙여줍니다.
함수뿐만 아니라 프로퍼티에도 async 개념을 적용할 수 있습니다.
특징은 read-only 프로퍼티만 async할 수 있다는 점입니다.
sequence에도 사용할 수 있습니다.
async-await는
스레드가 왔다갔다 이동하지 않고 한 스레드를 서스펜드 하는 방식으로 작동합니다.
비동기함수는 apple os에게 스레드의 제어권을 넘겨줬다가 끝나면 돌려받습니다.
정리하면 다음과 같습니다.
우측 처럼 이전에는 비동기함수를 테스트하려면 시간제한을 두는 방식으로 사용했어야 합니다.
하지만 async await를 사용해서 비동기함수를 테스트할 수 있게 되었습니다.
SwiftUI의 `onAppear` 와 같은 not asynchronous한 클로저에서 비동기 메서드를 사용할 땐 Task 블럭으로 감싸줘야 합니다.
애플에서 제공하는 여러 비동기 API가 있습니다.
과거에는 escaping closure로 결과를 처리했다면
이제는 async throws로 처리할 수 있게 되었습니다!
추가로 볼 세션
Meet Async Sequence: Async Sequence에 대한 내용
Structured concurrency in Swift: 병렬 asynchronous task
Swift concurrency: Behind the scenes
'WWDC' 카테고리의 다른 글
WWDC18) Image and Graphics Best Practice (0) | 2022.09.14 |
---|