티스토리 뷰
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 |
- Total
- Today
- Yesterday
- Django Firebase Cloud Messaging
- ipad multitasking
- ribs
- 장고 URL querystring
- Watch App for iOS App vs Watch App
- Flutter Clipboard
- 장고 Custom Management Command
- DRF APIException
- Sketch 누끼
- PencilKit
- flutter dynamic link
- Django Heroku Scheduler
- Flutter 로딩
- Flutter Text Gradient
- Dart Factory
- 플러터 싱글톤
- github actions
- cocoapod
- 구글 Geocoding API
- 플러터 얼럿
- Python Type Hint
- flutter 앱 출시
- Flutter getter setter
- Flutter Spacer
- drf custom error
- METAL
- flutter deep link
- flutter build mode
- SerializerMethodField
- Django FCM
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |