티스토리 뷰

🍏/Swift

[Swift] async / await 등장배경

eungding 2021. 6. 30. 00:54
반응형

 

WWDC 2021 - Meet async / await in Swift  중, 등장배경만 기록한 글 입니다. ✏️

 

UIKit은 iOS 15부터 이미지 썸네일링을 할 수 있는 메소드들을 제공합니다.  

func preparingThumbnail(of: CGSize) -> UIImage?  - synchronous한 방식

func prepareThumbnail(of: CGSize, completionHandler: (UIImage?) -> Void) - asynchronous 한 방식

 

이 썸네일 메소드를 예시로 하여 어떤 문제점이 있어서 async / await이 등장하게 되었는 지를 말씀해주십니다. 

 

# synchronous function 을 쓸 때

 

synchronous한 방식의 메소드를 쓰면 해당 쓰레드는 blocked 됩니다. 

저 메소드가 끝나기를 기다리면서 말이죠!

그래서 이 쓰레드는 아무 일도 못하게 됩니다. 

 

 

# asynchronous function 을 쓸 때

 

반면 asynchronous 하게 동작하는 메소드를 쓰면

쓰레드는 다른 일들을 할 수 있습니다. (prepareThumnail이 끝날 때 까지 기다리지 않음)

 

 

그리고 prepareThumnail 이 다 끝나면 completionHandler로 notify 해줍니다. 

 

 

# simple, easy, safe 하지 않은 fetchThumnail 메소드

 

뷰모델에 fetchThumnail 메소드가 있다고 해봅시다. 

fetchThumnail 메소드 안은 이런 스텝으로 구성되어있습니다.

imageURLString이 UIImage가 되기 까지의 과정입니다.

이 4가지 Operation들은 순서대로 이루어져야합니다. 

 

 

이 중, thumnaulURLRequest랑 UIImage는 synchronously 하게 동작해도 되는

무리없는 작업들입니다. 

 

 

 

하지만 이미지 데이터를 다운로드하고 썸네일을 렌더링하는 dataTask와 prepareThumnail은 시간이 많이 드는 일입니다. 

 

 

그래서 우리는 asynchronous function을 제공하는 것입니다. 

이 작업들은 asynchronously called 되어야합니다. 

 

우리는 이 메소드들을 completion handler를 이용하여 작성했습니다. 

 

 

하지만 이 메소드에는 문제가 있습니다!!

guard else return 하는 곳에서 completion handler를 불러야하는 것을 까먹었기 때문이죠!

만약 guard else return을 타게 된다면 이 메소드를 콜한 쪽에서는 작업의 성공/실패에 대한 notify를 절대 받지 못할 것입니다!

 

 

우리는 이렇게 코드를 바꿔야합니다!!

 

 

 

completion handler 안에서는 error를  throws 할 수 없습니다. 

그리고 completion handler을 invoke 하지 않은 곳이 있는 지 swift가 확신시켜주는(검증해주는) 방법도 없습니다. 

위의 예시처럼 너 스스로 코드를 검증해야합니다. 

 

 

또한 우리는 이 메소드를 보고 고민했습니다.

두개의 synchronous 메소드가 있고 completion handler가 필요한 두개의 asynchrous 메소드가 있습니다. 

 

총 20라인의 코드를 작성하게 되었고 

버그가 발생할 수 있어보이는 지점이 다섯개 있습니다. 

 

 

우리가 원했던 것은 4개의 operation을 순차적으로 실행시키는 것이였는데

이렇게 어렵고 의도가 모호해보이는 코드를 얻게 되었습니다. ㅠㅠ

 

더 안전한 방법을 탐색하면서

Result 타입을 써봤는데, 코드가 더 어글리해지고 길어졌습니다.

 

 

어떤 사람들은 asynchronous code를 개선하기 위해 Future를 씁니다.

하지만 이 접근도 simple, easy, safe 하지 않았습니다. 

 

 

그래서 Async/await 가 등장하게 되었습니다..! (다음편에 계속,,)

 

 

 

반응형

'🍏 > Swift' 카테고리의 다른 글

[Swift] async / await 사용사례  (0) 2021.07.06
[Swift] async / await 동작원리  (0) 2021.07.06
[Swift] Array popFirst  (1) 2021.05.07
[Swift] if case 예제  (0) 2021.01.20
[Swift] 전처리문 (#if DEBUG, #if os)  (1) 2020.08.09
댓글