티스토리 뷰
일단 원본 영상부터, Meet async/await in Swift
본 글은 해당 영상을 본 후 간단히 요약한 글로 블로그 주인장의 영어 실력이 좋은 편은 아니라 잘못 번역된 부분이 있을 수 있음
Why?
전통적인 Swift 코드에서는 비동기 동작에 대해 completionHandler를 이용하였음, 이는 다음과 같은 문제가 있었는데
- 해당 패턴에서는 중첩 클로저가 많아지고
- 이로 인해, 클로저들의 error를 관리하기 어려울 뿐 아니라 이로 인해 추적도 어려워짐
- 뿐만 아니라, 비동기 시스템의 종료를 명확하게 판단 할 수 없는 상태가 됨
이를 개선하는 목적으로 등장한게 async - await, 그래서
- 전통적인 비동기 처리 방식 대비, 훨씬 간결한 코드를 가지게 됨
- 비동기 처리를 한 라인에서 한 번만 발생시켜 각각에 대한 에러 처리를 할 수 있음
- await이라는 키워드를 통해 명시적으로 suspend 시점을 정할 수 있음
Asnyc / Await
다른 언어에서는 이미 많이 사용 중인 문법이라, 사용사례 자체가 익숙한 분들도 있을 듯 하다.
비동기 처리가 필요한 메서드에서 async를 붙이고 return에 대한 응답을 기다려야 하는 경우 await으로 함수를 중단 시킬 수 있다.
func fetchUser(from id: String) async throws -> User {
let user = try await fetchUserFromApi(id: id)
return user
}
위와 같은 메서드가 있다고 할 때, 다음과 같이 설명할 수 있는데
1. fetchUser는 비동기 처리를 위한 메서드
2. Api로 부터 user의 정보를 fetch 하는 동안 메서드에 suspend
-> 메서드에 대한 suspend 라는 건 걸린 상태에서도 DispatchQueue 우선 순위에 맞게 thread는 작동하고 있기 때문
3. 완료 되는 시점에 맞추어 받아온 사용자 정보를 반환
이렇게 함으로서, fetchUser는 본연의 기능에 집중 할 수 있을 뿐 아니라 error handling의 책임도 본 메서드를 호출 한 곳에서 처리할 수 있도록 만들어 줄 수 있음, 조금 더 독립된 메서드랄까.
More Advanced
1. async는 연산 프로퍼티에도 적용할 수 있음. 단, read-only인 경우에만 적용이 가능함
2. async가 달려있는 메서드는 suspend가 가능한 메서드임을 명시하는 것
3. await는 suspend의 지점을 명시하는 것
4. suspend로 기능이 멈추어 있어도, 다른 스레드들을 차단하는 것은 아님. 즉, 시스템이 다른 일을 스케쥴링 할 수 있음
-> UI Responder로 입력을 받아온다거나, Notification들을 수신한다거나 하는 등의
5. suspend 이후에는 await가 있던 메서드를 기점으로 다시 시작되고, 실행 지점은 호출 되었던 await
6. SwiftUI 내부에는 async를 지원하지 않는 경우가 있으므로, async가 필요하다면 Task와 같이 사용
Continuation(공식문서)
async/await을 사용하는 경우에도, 중첩 사용되는 사례가 생길 수 있음, 대표적으로 CoreData를 예로 들었는데
이런 경우에 suspend를 관리할 수 있도록 만들어진 구조체로 Asynchronous와 Synchronous사이의 인터페이스이다
async내에서의 중단을 관리할 수 있도록 만들어져 있음, continuation을 통해 에러와 반환 값을 미리 선언해둘 수 있고, 결과에 맞춰서 에러와 결과 값 반환이 가능하다.
참고로 continuation은 중복으로 사용이 불가능. 즉, 한 번 resume이 된 continuation은 다음 resume을 받지 못한다.
위 코드처럼 즉석에서 생성해서 사용하는 경우에는 문제가 없으나, continuation을 변수로 만들어 사용하면 resume 후 반드시 해당 변수를 nil로 초기화해, 중복해서 실행하는 경우를 방지 해야 한다.
async/await 이야기를 들었을 때, 사실 새롭다기보단 드디어 스위프트에도! 라는 생각을 먼저 했다.
'iOS > WWDC' 카테고리의 다른 글
WWDC 2019, Combine - Introducing Combine (0) | 2023.05.10 |
---|---|
WWDC 15, POP - Protocol-Oriented Programming in Swift (0) | 2023.04.25 |
- Total
- Today
- Yesterday
- Equatable
- 기술블로그
- 코드리뷰
- getx
- guri's dev
- github
- 리팩토링
- IOS
- Provider
- 개발문화
- lifecycle
- Swift
- 테크니컬라이팅
- combine
- 주저리주저리
- message
- struct
- document
- techincal
- UIKit
- viewcontroller
- Async
- WWDC
- writing helpful error message
- 개발자
- flutter
- POP
- OOP
- protocol
- await
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |