안녕하세요 이웃님들~~ 오늘은 Async Await를 사용할때 흔히하는 실수 Top 3라는 영상을 번역해서 포스팅 해보려고 합니다.
원본 영상은 https://www.youtube.com/watch?v=QdP9IeiBOQ8 여기에서 확인하실 수 있구요~!
자, 아래처럼 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)입니다")
아래와 같이 쓰시면 메모리 leak가 납니다. 딱봐도 지금 Task 안에 뭔가 self가 오지게 캡쳐될거 같죠?
네 그래서 [weak self]로 약한 참조를 해주시는데 guard 문은 꼭 for문 안에서 안하시면 메모리릭 발생할 수 있습니다!
어떤 튜토리얼을 보면 Task { } 쓰실때 Task.detached { } 요런식으로 작성하는게 기본이라고 생각하시는데 잘못된 생각입니다.
굳이 작업 스레드를 독립적으로 가져가고 싶은게 아니라면 detached를 사용하실 이유가 없다고 하네요.
정리하다가 조금 귀찮아 져서 그냥 코드는 캡쳐로 갈음을 했는데요~
그래도 쓱 봐 두면 도움이 되실것 같아서 가져왔습니다~!!
다음시간에는 Actor에 대해서도 다루어 보고 싶네요~
그럼 이만~~!!!
[iOS] CoreTelephony 를 활용하여 Cellular data 사용 가능 여부 알기 (0) | 2023.10.26 |
---|---|
[Swift] Decimal, Double의 소수점을 round, ceil, floor하기 (1) | 2023.06.26 |
[Swift Concurrency] Async/Await 진짜 쉽게 이해하기 (2) - 작성법 배우기 (0) | 2023.06.13 |
[Swift Concurrency] Async/Await 진짜 쉽게 이해하기 (1) - Do,Try,Catch 알기 (5) | 2023.06.12 |
[Swift/iOS] 촬영한 이미지 돌아감 현상의 원인과 해결방법 (+카메라앱) (0) | 2023.02.13 |