해당 글은 [WWDC21] Use async/await with URLSession 보고 작성했습니다.
Swift Concurrency 에 대한 얘기가 몇몇 나왔었다.
Swift Concurrency에 대해 간략하게 설명해보자면, 코드를 선형적이고 간결하게 만들고, Native Swift Error Handling 지원한다.
네트워킹은 본질적으로 비동기로 작동하고, iOS15 및 macOS Monterey에서는 Swift Concurrency 기능을 활용할 수 있도록 URLSession에 새로운 API를 도입했다고 합니다!
지금까지 URLSession을 사용할 때, 대부분 completionHandler를 기반으로 사용했을 것입니다.
아래는 제가 작성한 예시이고, 환율 정보 API를 요청하는 부분입니다.
제어 흐름
이와 같은 코드는 task.resume()
가 가장 먼저 실행되고, guard문에 걸리지 않으면 마지막 completion handler가 작동을 하고, 이 흐름은 종료됩니다.
제어 흐름이 복잡합니다.
스레딩
- 가장 바깥쪽 레이어는 호출자의 쓰레드 혹은 큐에서 실행됩니다.
- URLSessionTask CompletionHandler는 세션의 대리자 재기열에서 실행됩니다.
요청을 성공적으로 받아왔을 때, UI 업데이트를 해준다던가 하면 성공시 completion Handler의 작동을 Main Queue에서 작업을 해줘야할 것입니다.
컴파일러는 여기서 도울 수 없기에 data race와 같은 스레딩 이슈를 피하기 위해 극도의 주의를 기울여야 한다고 하네요..!
async/await
async/await을 사용하면 어떻게 작성될까요?
URLSession.shared.data 이외에도 다양한 메서드가 존재합니다.
iOS 15부터는 다음과 같은 메서드를 사용할 수 있습니다.
)
data, upload, download를 사용할 수 있군요..!
그런데 iOS 13부터도, 사용할 수 있도록 변경되었다고 하네요..!
저는 Result타입으로 Error Handling을 하고싶어서 다음과 같이 코드를 수정했습니다.
훨씬 코드가 깔끔해진 것 같아요. 기존에 completion Handler를 사용했을 때는 약간 지저분해 보이기도 하고, 흐름을 알아보기 힘들었는데.. 이 방법을알게되어서 자주 사용하게 될 것 같습니다!