[iOS - WWDC] Meet async/await in Swift #2

spring·2022년 7월 1일
0

WWDC Study

목록 보기
3/4
post-thumbnail

※ 1편에 이어 작성된 포스팅입니다!
※ 1편 링크 : [iOS - WWDC] Meet async/await in Swift #1

비동기 함수의 일시 중단의 의미?

  • 함수를 호출할 때 어떤 일이 발생하는지 먼저 알아보자.
    (fetchThumbnail 내부에서 thumbnailURLRequest를 호출한 상황)

    1. 함수가 호출되면 실행중인 스레드의 제어를 해당 함수에 넘긴다.
    2. 이 때 호출한 함수가 thumbnailURLRequest처럼 일반 함수인 경우 스레드는 완료될 때까지 해당 함수 대신 작업을 수행하는 데에 사용된다. 이 작업은 함수 자체의 본문에 있거나 호출하는 다른 함수에 있을 수 있다.
    3. 호출한 함수는 값을 반환하거나 오류를 발생시켜 완료된다.
    4. 나의 함수에게 제어를 다시 넘겨준다.
      → 일반 함수가 스레드 제어를 포기할 수 있는 유일한 방법
      ++ 내가 만든 함수는 제어할 수 있는 유일한 함수
  • async 키워드가 붙은 비동기 함수인 경우엔 조금 다름

    • 완료되면 종료, 함수에 대한 제어가 반환은 일반 함수와 동일!
    • 하지만 일반 함수와 달리 완전히 다른 방식으로 스레드 제어를 포기할 수 있는데 이것이 일시 중단이다.
    1. 비동기 함수를 호출하면 스레드에 대한 제어 권한이 부여된다.
    2. 일단 실행되면 비동기 함수는 일시 중단될 수 있고 이때 스레드의 제어를 포기한다.
    3. 하지만 나의 함수에게 제어권을 제공하는게 아닌 시스템에 스레드 제어권을 제공한다.
    4. 그러면 나의 함수도 일시 중단된다.
    5. 일시 중단은 시스템에게 “할 일이 많다는 것을 알고 있어. 뭐가 중요한지 결정해"라고 말하는 방법이다.
    6. 함수가 일시 중단되면 시스템은 스레드를 사용하여 다른 작업을 수행할 수 있다.
    7. 어느 시점에서 시스템은 이전에 중단되었던 비동기함수를 계속 실행하는 것이 가장 중요한 작업이라고 결정할 것이다. 이 시점에 시스템은 중단되었던 비동기함수를 재개 (resume)한다.
    8. 그럼 해당 비동기 함수는 스레드를 다시 제어하고 작업을 계속할 수 있다. 원하는 경우 다시 일시 중단될 수 있다.
  • async 로 표시되어 있다고 해서 반드시 일시중지 되는 것은 X
  • await가 표시된다고 해서 함수가 확실히 거기에서 일시 중단된다는 의미도 X
  • 그러면 일시 중단될 때 어떤 일이 발생할 수 있는지 fetchThumbnail을 다시 살펴보자.
    • fetchThumbnailURLSession의 비동기 메소드인 data를 호출하면 data 메소드는 비동기 함수만 할 수 있는 특별한 방식으로 스레드에서 실행을 중지
    • 스레드 제어를 시스템에게 제공, 시스템에 data 메소드에 대한 작업을 예약하도록 요청
    • 하지만 시스템이 제어되고 해당 작업이 즉시 시작되지 않을 수도 있음
      만약, fetchThumbnail이 호출된 후 사용자가 어떤 데이터를 업로드할 수 있는 버튼을 누른다고 가정, ex) 게시물에 반응할 수 있는 버튼(좋아요 버튼 등)
    • 시스템은 대기 중인 작업 전에 사용자의 반응을 게시하는 작업을 자유롭게 실행할 수 있음, 이 작업이 완료되면 data 메소드가 재개되거나 시스템이 다른 작업을 실행할 수 있다.
    • 마지막으로 data 메소드가 완료되면 fetchThumbnail로 돌아간다.

→ 함수가 일시 중단된 동안 다른 작업을 수행할 수 있다는 사실을 알 수 있음!
즉, 앱 상태가 크게 변할 수도 있다는 뜻.
그래서 Swift는 await 키워드로 비동기 호출을 표시해야 한다고 주장

completion handler 사용 시에도 마찬가지!

BUT!
나는 async/await 코드에 수반되는 모든 식과 들여쓰기가 없기 때문에
await 키워드가 코드 블록이 하나의 트랜잭션으로 실행되지 않음을 확인하는 방법


async/await에 대해 기억해야 할 중요한 사항

  1. 함수를 async로 표시하면 일시 중단됨, 함수가 자신을 일시 중단하면 호출자도 일시 중단임
    → 즉, 호출자도 비동기식이어야 함
  2. await 키워드 : 비동기 함수에서 한 번 or 여러 번 일시 중단될 수 있는 위치를 표시하기 위함
  3. 비동기 함수가 일시 중단되는 동안 스레드는 차단되지 않음
    → 시스템은 다른 작업을 자유롭게 예약할 수 있다!
    → 나중에 시작되는 작업도 먼저 실행할 수 있다!
    다시 말하면, 일시 중단된 동안 앱의 상태가 크게 변할 수도 있음
  4. 비동기 함수가 재개되면?
    호출한 비동기 함수에서 반환된 결과가 원래 함수로 되돌아 옴, 실행은 중단되었던 바로 그 자리에서 계속됨

여기까지 영상을 시청했는데 뒷부분은 대본으로만 대충 봤는데 XCTest로 테스트하는 것 등등... 아직은 어렵기도 했고 이정도면 async/await의 개념 정도는 정리할 수 있는 것 같아서 뒤는 자세히 보지는 않았다..!

언젠가.. 보는 걸로, (지키지 못할 말)

※ 혹시 잘못된 부분이나 오타가 있다면 알려주시고 헷갈리는 부분은 언제든지 같이 이야기 나눠보아요! 🤗
※ 영상의 앞 내용은 1편 참고 부탁드립니다.
※ 현재 포스팅은 대략 15:03~20:53 내용입니다.

🎥 WWDC 영상 링크 : https://developer.apple.com/videos/play/wwdc2021/10132/

profile
CS 4th 💻

0개의 댓글