안녕하세요.
예전에 봤던 async/await WWDC 영상 다시 보고 내용 정리 해 볼게요!
여러 번 봐서 그런가 별로 어렵진 않더라구요? 흐흐..
# async/await 사용 전
asyc/await가 없던 시절 비동기 처리를 하려면 completion handler나 delegeate를 사용했어야 했습니다.
ㅇㄱㄹㅇ completion handler 방식은 복잡해질수록 indent 때문에 코드 가독성이 떨어지고 handler를 까먹고 호출하지 않아서 동작이 멈추는 경우가 생길 수 있습니다.
#asyc/await 사용
async/await를 사용하면 위 코드를 이렇게 줄일 수 있어요.
[참고] thread blocking
async API가 호출되면 thread는 비동기처리가 완료되기 전까지 unblocking 상태가 됩니다.
await 동작이 완료될 때까지 시스템이 해당 thread에 다른 task를 할당시킬 수 있어요.
[주의] await로 resume 되는 thread는 await 되기 전 thread와 다를 수 있습니다.
# async property
async는 함수뿐만 아니라 property에도 사용할 수 있어요.
[주의] async property 제약사항
1) explicit(명시적) getter를 가져야 합니다.
2) read-only property에만 async를 사용할 수 있어요.
# async sequence
async/await을 for loop에서도 사용할 수 있어요.
# async/await 정리
1) async는 함수를 suspend 시킨다.
2) async 함수로 인해 동작이 suspend 될 수 있는 시점을 await으로 표시한다.
3) 동작이 suspend 되는 동안 다른 task가 실행될 수 있다.
4) async 함수 동작이 완료되면 await 이후로 resume 된다.
# 테스트 코드에 async/await 적용
async/await이 없던 시절엔 아래처럼 XCTestExpectation을 사용해서 비동기 동작에 대한 테스트를 했어요.
async/await로 코드가 좀 더 명확해졌어요!
# sync 함수에서 async 함수 호출
sync 함수에서 async 함수를 호출해야 하는 경우엔 Task를 사용합니다.
[참고] Task?
Task는 가능한 thread에서 즉시 실행시킬 수 있도록 Task 클로저 안의 작업들을 패키지화해서 시스템으로 보냅니다.
# 기존 비동기 함수에 async 함수 추가
completion handler 또는 delegate로 비동기 처리를 하는 함수 또는 로직을 전부 async로 바꾸기 어려울 수 있어요.
이 경우엔 withCheckedThrowingContinuation를 사용해서 기존 함수는 유지하고(=기존 로직 수정 없이) 별도의 async 함수를 추가해 줄 수 있어요.
completion handler 방식인 경우 아래처럼 사용합니다.
[주의] 각 상황에서 resume 함수는 1번만 호출되어야 한다.
delegate 방식인 경우, continuation을 프로퍼티에 저장하고 있다가 delegate가 호출될 때 resume 하고 저장한 continuation 프로퍼티를 nil로 설정해 주세요.
[참고] resume 후 nil로 설정하는 이유
resume이 여러 번 호출되는 것을 막기 위해!!
# 참고
'WWDC' 카테고리의 다른 글
[WWDC21] Explore structured concurrency in Swift (0) | 2024.05.28 |
---|---|
[WWDC21] Meet AsyncSequence (0) | 2024.03.13 |
[WWDC22] NavigationStack, NavigationSplitView (0) | 2024.03.02 |
[WWDC20] State, Binding, StateObject, ObservedObject (0) | 2024.02.19 |
[WWDC20] App essentials in SwiftUI (0) | 2024.01.15 |