일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- panorama view
- 360도 이미지
- 360도 뷰어
- 명시적 정체성
- launchscreen
- 뷰 생명주기
- 360도 이미지 뷰어
- 뷰 정체성
- completion handler
- launch screen
- 앱 성능 개선
- data driven construct
- React Native
- 리액트 네이티브
- 라이브러리 없이
- @sendable
- 구조적 정체성
- React-Native
- requirenativecomponent
- 파노라마 뷰
- 스켈레톤 통합
- 리액트
- Android
- native
- react-native-fast-image
- ssot
- SwiftUI
- 네이티브
- ios
- react
- Today
- Total
Neoself의 기술 블로그
Meet async/await in Swift 정리 본문
일반 함수의 경우, completion handler를 통해 작업을 호출하면, 곧바로 스레드 제어권을 다시 함수가 갖게 되지만, async 함수는 작업이 완료되면 스레드를 일시 중단하여 함수가 갖고 있던 스레드 제어권을 시스템에 넘깁니다. 이 과정에서 호출자 즉 함수 역시 일시 중단됩니다.

만일 fetchThumbnail에서 비동기 메서드를 호출하면, 스레드의 제어권을 시스템에 넘겨주고, 시스템에게 URL Session의 data 메서드 작업을 예약해달라고 요청합니다.
이 시점에서 시스템이 제어권을 가지게 되기에, 작업이 바로 시작되지 않으며, 다른 작업에 사용될 수 있습니다.
설령, 늦게 시작된 다른 작업이 먼저 실행된 이후, data 메서드가 재개될 수 있습니다.
이렇게 system에 의해 data 메서드 작업이 완료되면, fetchThumbnail로 돌아가게 됩니다.
여기서 주의해야할 점은, 함수가 await 키워드가 표시된 비동기 작업을 수행하면서 함수가 일시중단될 때, 앱의 상태가 크게 변경될 수 있습니다. 더 나아가 함수는 완전히 다른 스레드에서 재개될 수도 있습니다.
async로 함수를 표시한다는 것은 함수가 일시중단될 수 있으며, 호출자도 일시 중단한다는 것을 의미합니다.
await 키워드는 이러한 일시중단 위치를 명시하기 위해서입니다.
async 함수가 일시중단되는 동안 스레드가 block되는 것이 아니기에, 스레드에 다른 작업을 자유롭게 예약하거나 먼저 실행될 수 있음.
Continuation
비동기 작업이 일시 중단된 시점에서 나중에 다시 재개할 수 있도록 하는 매커니즘
- 비동기코드가 일시 중단된 상태를 캡처
- resume 메서드를 통해 비동기 작업이 완료되었을 때, 실행 흐름을 재개
- 하기 협동적 실행 과정과 관련이 있음
협동적 실행


위 사진의 경우 메서드를 호출하는 부분은 함수 호출의 결과를 Core Data(혹은 System)으로부터 기다리고, 다음에 무엇을 할지 지정하는 클로저를 제공합니다.
코어 데이터로부터 비동기 호출이 종료되면, 완료 핸들러를 호출해 호출자가 결과로 하고 싶었던 작업을 재개합니다.
이를 Apple에서는 협동적 실행이라고 하며, Swift에서의 비동기 작업이 실행되는 방식이라고 설명합니다.
Continuation 사용법

완료 핸들러에서 async Swift 함수로의 Bridge 구성요소
이 협력적 실행을 명확히 하기 위해 Swift는 아래와 같이 고수준의 안전한 방식으로 Continuation을 생성, 관리 및 재개하는 기능을 제공합니다. 이는 일시 중단된 비동기 함수를 재개하는 데에 사용할 수 있는 Continuation 값 접근 방법이며, await 호출이 completion 블록 반환을 기다릴 수 있도록 합니다.
1. withCheckedThrowingContinuation
오류가 있는 완료 블록을 던지는 async Swift 함수로 끌어올리는
2. withCheckedContinuation
함수가 오류를 발생시키지 않을 것이라고 알고 있는 상황에 사용
3. continuation.resume()
완료핸들러의 결과를 넣을 수 있으며, 완료 핸들러의 반환을 기다리는 모든 호출을 재개하는 데에 필요한 연결 고리를 제공합니다.
*이 때, resume()는 모든 경로에서 정확히 한번 호출되어야 하며, Swift runtime이 resume이 미호출되는 상황은 감지하여 경고하며, 동일한 함수에서 continuation.resume이 여러번 호출되는 것또한 프로그램 데이터가 손상될 수 있기에, 두번째 재개 지점에 fatal error를 발생 시킵니다.
'개발지식 정리 > WWDC 정리' 카테고리의 다른 글
SwiftUI | Beyond scroll views 정리 (0) | 2025.04.04 |
---|---|
Protect mutable state with Swift actors 정리 (0) | 2025.04.03 |
Explore structured concurrency in Swift 정리 (0) | 2025.04.01 |
Understanding Swift Performance 정리 (0) | 2025.01.07 |
SwiftUI 심층정리 (0) | 2024.12.16 |