비동기란?

  • 나중에 알 수 없는 시간에 호출될 수 있는 코드
  • 코드가 읽혀도 바로 실행되지 않음
  • 이후 라인에 있는 코드 실행을 막지도 않음

async / await의 도입 배경

에러핸들링의 복잡도

비동기 통신 과정에서 여러개의 데이터를 가져오는 경우 모든 과정에 대한 에러처리가 쉽지가 않다. 컴파일러가 에러에 대한 부분을 언급하지 않기 때문에 에러처리를 하지 않고 넘어간 부분에서 에러가 발생한다면 문제 파악이 쉽지가 않다.
이러한 문제들을 해결할 방법으로 iOS 13 이상부터는 async/await를 사용하거나 RxSwift를 사용할 수 있다.

비동기 함수 호출의 문제점

비동기 함수의 호출과 completionHanldler 콜백 형식은 읽기 어려울 뿐만 아니라 호출을 까먹거나 콜백처리를 제대로 해주지 못하는 경우들이 발생할 수 있다. 또한 오류처리를 상세하게 하려면 코드가 너무 복잡해지는 문제도 발생한다.

특징

비동기 코드를 마치 동기 코드인 것처럼 작성할 수 있다. Swift는 작업이 종료될 때 completionHandler 없이도 호출부에 알려주는 것을 보장하고, 개발자는 이를 이용하여 더욱 안전하고 짧은 코드를 작성할 수 있다.

async

함수 이름 뒤에 async가 붙으면 비동기라는 것을 나타낸다. 작성 순서는 async throws -> try await (에러 반환)
async 코드는 동시 컨텍스트에서만 실행이 가능하다. 즉, 다른 async 함수 내 혹은 Task{} 를 통해 수동으로 동시 컨텍스트를 제공할 때 그 안에서 사용이 가능하다.

await

async 함수를 호출하기 위해서는 await 키워드가 필요하다. 대표적으로 URLSession 함수가 async이다.
이 await 키워드를 만나면 해당 함수에서 일시중단 될 수 있다. -> 해당 스레드가다른 동작을 수행항 수 있게 제어권을 넘긴다.
이렇게 await로 표시된 코드의 일시 중단 지점은 스레드 양보라고도 불린다.

일시중단? suspend?

비동기 함수가 호출되면 기존에 실행되던 함수는 스레드의 제어권을 비동기 함수에게 전달한다. 그 이후 비동기 함수가 완료되면 기존 함수에게 다시 제어권을 돌려준다. 하지만 비동기 함수가 제어권을 가지고 실행되는 와중에 일시중단이 될 수 있기 때문에 시스템이 우선순위를 판단하여 가장 중요한 작업을 실행하고 비동기 함수에게 제어권을 돌려줘서 해당 함수를 재개 하게 된다.

스레드 관리

sync에서의 스레드 관리

  • 호출 - A함수에서 B함수를 호출하면 A함수가 제어권을 B에게 전달
  • 진행 - B함수가 종료될때까지 다른 작업을 수행하지 않음
  • 종료 - B함수가 종료되면 A함수에게 제어권을 반납

async에서의 스레드 관리

  • 호출 - A함수에서 B함수를 호출하면 A함수가 제어권을 B에게 전달
  • 진행 - B함수가 async라면 제어권을 포기하는 suspend가 가능
  • suspend - 시스템에게 제어권을 넘기고 시스템은 스레드를 사용하여 다른 작업을 수행
  • 종료 - B함수가 종료되면 A함수에게 제어권을 반납

태그: ,

카테고리:

업데이트:

댓글남기기