본문 바로가기

WWDC

[WWDC21] Use async/await with URLSession을 적용해보자..!

반응형

해당 글은 [WWDC21] Use async/await with URLSession 보고 작성했습니다.

Swift Concurrency 에 대한 얘기가 몇몇 나왔었다.

Swift Concurrency에 대해 간략하게 설명해보자면, 코드를 선형적이고 간결하게 만들고, Native Swift Error Handling 지원한다.

네트워킹은 본질적으로 비동기로 작동하고, iOS15 및 macOS Monterey에서는 Swift Concurrency 기능을 활용할 수 있도록 URLSession에 새로운 API를 도입했다고 합니다!

지금까지 URLSession을 사용할 때, 대부분 completionHandler를 기반으로 사용했을 것입니다.
아래는 제가 작성한 예시이고, 환율 정보 API를 요청하는 부분입니다.

제어 흐름

image

이와 같은 코드는 task.resume()가 가장 먼저 실행되고, guard문에 걸리지 않으면 마지막 completion handler가 작동을 하고, 이 흐름은 종료됩니다.

제어 흐름이 복잡합니다.

스레딩

image

  • 가장 바깥쪽 레이어는 호출자의 쓰레드 혹은 큐에서 실행됩니다.
  • URLSessionTask CompletionHandler는 세션의 대리자 재기열에서 실행됩니다.

요청을 성공적으로 받아왔을 때, UI 업데이트를 해준다던가 하면 성공시 completion Handler의 작동을 Main Queue에서 작업을 해줘야할 것입니다.

컴파일러는 여기서 도울 수 없기에 data race와 같은 스레딩 이슈를 피하기 위해 극도의 주의를 기울여야 한다고 하네요..!

async/await

async/await을 사용하면 어떻게 작성될까요?

image

URLSession.shared.data 이외에도 다양한 메서드가 존재합니다.

image

iOS 15부터는 다음과 같은 메서드를 사용할 수 있습니다.

image

)

image

data, upload, download를 사용할 수 있군요..!

그런데 iOS 13부터도, 사용할 수 있도록 변경되었다고 하네요..!

image

저는 Result타입으로 Error Handling을 하고싶어서 다음과 같이 코드를 수정했습니다.

image

훨씬 코드가 깔끔해진 것 같아요. 기존에 completion Handler를 사용했을 때는 약간 지저분해 보이기도 하고, 흐름을 알아보기 힘들었는데.. 이 방법을알게되어서 자주 사용하게 될 것 같습니다!

반응형