WWDC

[WWDC21] Meet async/await in Swift

Phililip
728x90

안녕하세요.

 

예전에 봤던 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이 여러 번 호출되는 것을 막기 위해!!

 

# 참고

 

Meet async/await in Swift - WWDC21 - Videos - Apple Developer

Swift now supports asynchronous functions — a pattern commonly known as async/await. Discover how the new syntax can make your code...

developer.apple.com

 

 

반응형