[Swift] async / await 사용사례
[Swift] async / await 동작원리 에서 이어집니다.
WWDC 2021 - Meet async / await in Swift 중, async / await 에 대한 사용사례를 기록한 글입니다.
[1] Async sequences
for문에서도 await / async 를 사용할 수 있습니다.
자세한 내용은 WWDC 21 - Meet AsyncSequence / WWDC 21 - Explore structed concurrency in Swift 를 참고해주세요
[2] Testing async code
예전에 비동기 테스트를 하려면 expection을 setting하고
expection.fulfill 도 해줘야하고
wait도 불러줘야하고
불편했습니다.
하지만 async를 쓰면
불편한 것들이 싹 사라집니다.
그리고 XCTAssertNoThrow 를 쓰면
throw를 하지 않는 지를 더 간단하게 검증할 수 있습니다.
[3] Bridging from sync to async
onAppear modifier는 non-async closure 이기 때문에
이 안에서 await을 써주면 아래와 같은 에러가 납니다.
이럴 때는 async task function을 써주면 됩니다.
async task 는 클로져에 있는 작업을 감싸서 system에게 보냅니다.
next available thread에 immediate execution 해달라고 요청하며..!
[4] Async APIs in the SDK
예전에 completionHandler로 제공하던 API들을
async하게 제공합니다.
그리고 예전에 delegate에도 completion Handler를 사용했습니다..!
예를들어 Clockit Complication DataSource 부분을 봅시다.
이제 이렇게 제공합니다.
[5] Bridiging completionHandler to Async
아래와 같이 completionHandler를 받는 메소드를
Async function으로 래핑하고 싶다고 해봅시다.
await / resume 되는 원리를 기억하며
withCheckedThrowingContinuation 를 사용해주면 됩니다.
주의사항이 있는데, continuation.resume은 every path에 딱 한번만 불려야합니다.
그리고 delegate callback으로 notify 해주는 경우에서는
아래와 같이 async/await을 adopt할 수 있습니다.