상세 컨텐츠

본문 제목

[Swift Concurrency] Async/Await 진짜 쉽게 이해하기 (3) - 흔히 하는 실수

Swift

by Mr.Garlic 2023. 6. 13. 17:29

본문

Async Await 흔히하는 실수

 

안녕하세요 이웃님들~~ 오늘은 Async Await를 사용할때 흔히하는 실수 Top 3라는 영상을 번역해서 포스팅 해보려고 합니다.

원본 영상은 https://www.youtube.com/watch?v=QdP9IeiBOQ8 여기에서 확인하실 수 있구요~!

 

실수 1 : 동기적으로 실행하면 안되지 효율적으로 하려고 비동기 하는건데?

자, 아래처럼 await를 쓰면 어떻게 될까요?

getUser() 가 완전히 끝나서 user에 값이 들어오면 getAddress()를 하고, 마찬가지로 getAddress()가 다~ 끝나야 paymentMethod를 가지고 올겁니다. 이게 저희가 원하는게 맞나요? 사실 user가 먼저 들어와야 하는거? 네 맞죠 user가 있어야 address랑 paymentMethod를 요청할 수 있으니까요. 하지만 address랑 paymentMethod는 서로 기다려줄 필요없이 바로바로 하면 되거든요.

// 이렇게 하면 안됩니다.

let user = await getUser()

let address = await getAddress(of: user)

let paymentMethod = await getPaymentMethod(of: user)

// 이렇게 해야 됩니다.
let user = await getUser()

async let address = getAddress(of: user)

async let paymentMethod = getPaymentMethod(of: user)

// 주소랑 결제수단 정보가 모두 필요할 때를 알아야 한다면 그때 await사용
await print("주소는 \(address)이고 결제 수단은 \(paymentMethod)입니다")

 

 

실수 2 : 메모리 관리

아래와 같이 쓰시면 메모리 leak가 납니다. 딱봐도 지금 Task 안에 뭔가 self가 오지게 캡쳐될거 같죠?

 

네 그래서 [weak self]로 약한 참조를 해주시는데 guard 문은 꼭 for문 안에서 안하시면 메모리릭 발생할 수 있습니다!

 

 

 

 

Task.detached { }  의 사용

어떤 튜토리얼을 보면 Task { } 쓰실때 Task.detached { } 요런식으로 작성하는게 기본이라고 생각하시는데 잘못된 생각입니다.

굳이 작업 스레드를 독립적으로 가져가고 싶은게 아니라면 detached를 사용하실 이유가 없다고 하네요.

 

MainActor = 메인스레드에서 돌아가고 있다
이렇게 굳이 바꾼다고 해서 얻어갈 이득이 없는 상황

 

정리하다가 조금 귀찮아 져서 그냥 코드는 캡쳐로 갈음을 했는데요~

그래도 쓱 봐 두면 도움이 되실것 같아서 가져왔습니다~!!

다음시간에는 Actor에 대해서도 다루어 보고 싶네요~

 

그럼 이만~~!!!

관련글 더보기