티스토리 뷰

🍏/Swift

[Swift] async / await 동작원리

eungding 2021. 7. 6. 09:39
반응형

[Swift] async / await 등장배경 에서 이어집니다. 

WWDC 2021 - Meet async / await in Swift  중, async / await 에 대한 소개를 기록한 글 입니다. 

 

[1] async / await 

이제 async / await 을 사용한 버전을 살펴봅시다. 

function에 completionHandler를 넘겨주는 대신 function에 async를 표시해줬습니다.

아래 함수처럼 throws 앞에 async를 적어줘야합니다. (다른 위치에 적으면 function이 throws 되지 않는다고 합니다) 

 

 

async throws를 표시한 저 함수는 어떻게 동작할까요?

- thumbnail이 성공적으로 받아와지면 thumbnail은 simply return 됩니다. 

- 하지만 에러를 만나면 just thrown 됩니다. 

 

전체코드는 아래와 같습니다.

20라인이 6라인이 되었습니다.

 

 

1) 

주목할 만한 부분은 위에서 두번째 라인 URLSession.shared.data 입니다. 

async throws 하는 함수니까 try await을 표시해줬습니다. 

"throws"로 표시된 함수를 호출할 때 "try"가 필요한 것처럼, 

"async"로 표시된 기능을 호출하려면 "await"가 필요합니다.

 

그리고 저 함수는 unblock thread 합니다. (쓰레드가 다른 일들을 할 수 있음)

 

2) 

그리고 밑에서 두번째 라인 thumnail 도 살펴봅시다.

SDK에 있는 것이 아니라 extension으로 추가하신 거라고 합니다.

 

getter에 async를 표시했습니다. 

read-only properties만 async를 표시할 수 있습니다. 

(여기서는 없지만 Swift 5.5에서는 property getter도 throw 가능합니다.

아까 function 처럼 async throw 순서로 표시해주면 된다고 하네요)

 

 

3)

그리고 마지막으로 전체를 살펴봅시다.

4가지 Operation이 순서대로 실행되고 있습니다.

단지 에러를 만나면 throw 하거나 아니면 return 해줍니다. 

Safe, Short 해졌습니다. 

 

 

 

[2] async / await  동작원리

 

async / await 동작원리에 대해서 살펴봅시다.

요약하면 아래와 같습니다.

 

 

 

# normal function

 

normal function을 call하는 경우

저 작업이 끝날 때 까지 쓰레드를 occupied (점령한) 합니다. 

 

 

 

# async function

 

async function은 normal function과 다릅니다.

요약하자면 async function은 suspend 될 수 있고 그동안 other work가 실행될 수도 있습니다. 

 

async fuction을 콜하면 asyn fuction은 suspend 될 수 있는 가능성이 있습니다. 

suspend 란 시스템에게 “I know you have a lot of work to do. You decide what’s most important.”  라고 말하는 것과 같습니다.

즉 쓰레드에 컨트롤을 넘겨주는 것이고 쓰레드는 async function 보다 더 중요한 일이 있다면 async function을 suspend 하고 더 중요한 일을 먼저 합니다. 어느 시점에 시스템은 async function을 resume 합니다. 

그리고 시스템이 원한다면 async function을 여러번 또다시 suspend 할 수 있습니다. 

 

async function이 finish 되면 컨트롤은 쓰레드에서 해당 function으로 다시 넘어옵니다. value 또는 error 와 함께! 

 

 

아까 fetchThumnail을 예를 들어 살펴봅시다. 

첫번째 라인은 sync function이고

두번째 라인은 async function 입니다.

시스템이 컨트롤을 가지게 되므로 바로 URLSession.shared.data가 실행되지 않을 수 도 있습니다. 

 

 

그 때 사용자가 어떤 라이킷 버튼을 눌렀습니다. 그래서 data를 upload해야합니다. 

 

 

그래서 시스템은 likeit을 보내는게 더 우선순위라고 판단해서 

URLSession.shared.data 보다 이 작업을 더 먼저 합니다. 

 

 

이 작업이 끝나고 URLSession.shared.data 이 resume 됩니다.  (또는 시스템이 other work를 더 먼저 실행할 수 도 있고..) 

 

 

 

URLSession.shared.data 가 끝나면 fetchThumbnail로 return 되게 됩니다. 

await keyword 는 너에게 바로 실행이 안될 수 도 있음을 알려주는 keyword 인 셈입니다. 

 

 

 

반응형

'🍏 > Swift' 카테고리의 다른 글

[Swift Algorithms] chunks(ofCount:)  (0) 2021.09.28
[Swift] async / await 사용사례  (0) 2021.07.06
[Swift] async / await 등장배경  (0) 2021.06.30
[Swift] Array popFirst  (1) 2021.05.07
[Swift] if case 예제  (0) 2021.01.20
댓글