티스토리 뷰

Swift

[Swift] WWDC async/await 정리

Kim_Baechu 2022. 4. 13. 12:46

 

https://developer.apple.com/videos/play/wwdc2021/10132/?time=1135 

 

Meet async/await in Swift - WWDC21 - Videos - Apple Developer

Swift now supports asynchronous functions — a pattern commonly known as async/await. Discover how the new syntax can make your code...

developer.apple.com

 

간단한 사용법만 정리했습니다.

URLSession의 dataTask와 prepareThumbnail은 비동기적으로 동작합니다.

그래서 각각의 작업이 완료되고 나서 다음 작업이 진행되고, 작업이 실패할 경우 예외 처리를 해줘야 합니다.

 

guard let 처리에서도 까먹지 않고 해줘야합니다.

swift 에서 prepareThumbnail같은 건 그냥 클로저일 뿐입니다.

이게 항상 호출되길 바라지만 스위프트에서는 강제할 수 없습니다.

compilation error가 발생하지 않는 이유입니다.

 

위에서 보다 더 안전하게 만들기위해 Result type을 사용할 수 있습니다.

안전해지긴 했지만 좀 uglier 해지고, 코드가 길어집니다.

 

async/await를 사용 해보겠습니다.

비동기적인 URLSession data(for: request)를 사용해서 다운로딩을 시작합니다.

dataTask와 다르게 awaitable합니다. 쓰레드를 막지 않으면서 대기합니다.

data 메서드가 throws 기 때문에 try를 사용합니다.

컴플리션 핸들러에서 귀찮았던 것들이 그냥 try하나로 가능합니다.

에러가 발생하면 fetchTumbnail은 에러를 throw할겁니다.

 

UIImage를 생성하고  썸네일이 렌더링되면 이것을 리턴하고 아니면 에러를 던집니다.

20줄자리 코드가 6줄로 줄어들고 들여쓰기 없이 쓸수 있습니다.

 

maybeImage?.thumbnail에서 await를 사용했는데 thumbnail 프로퍼티가 async 하기 때문입니다.

function만 async한게 아니라 프로퍼티도 async 하고 이니셜라이저도 async할 수 있습니다.

 

UIImage의 extension에 프로퍼티를 만들었습니다.

read-only만 가능하고 getter가 있으며 async 를 붙여줘야 합니다.

스위프트 5.5에서 getter는 throw할 수 있습니다.

await는 thread를 블락하지 않습니다.

for문에서도 async가 가능합니다.

 

 

 

댓글
공지사항