안녕하세요! S01A 강현준, 유한준입니다. 오늘도 잘 부탁드립니다~!
## 시연 영상

## 구현 내용
- [x] AVFoundation의 AVCaptureSession을 활용한 카메라 구현
- [x] CIFilter를 활용한 UIImage 바코드 생성
- [x] 타이머를 활용해 바코드 유효시간 설정
- [x] UIView animateKeyframes 기능을 활용한 별동별 애니메이션 체인 구현
- [x] AudioServicesPlaySystemSound를 활용해 지폐인식성공 알림소리 설정
## 고민 및 질문
1. 다른 View의 Frame의 크기를 이용할 때 어느 시점에서 호출하는 것이 가장 자연스러운 방법인지 고민이 됩니다.
- AVFoundation의 AVCaptureSession을 이용하여 카메라 기능을 구현하였습니다. 카메라가 비추는 화면을 보여주기 위해서는 previewLayer를 생성하여야 했고 previewLayer의 frame크기를 displayView의 frame 크기로 설정하는 코드를 작성하였습니다.
- 해당 코드를 viewDidLoad에서 호출하였을 경우 displayView의 frame크기가 결정되지 않아 layer가 원하는 크기로 표시되지 않았습니다.
- viewDidAppear에서 호출할 경우 해당 문제는 해결되었으나 previewLayer가 나타나는 시간이 사용자가 눈치챌 수 있을 시점이었습니다.
- 결국 이를 해결해주기 위해 viewDidLayoutSubview에서 해당 함수를 호출했고 앱이 백그라운드로 들어가거나 나올 때 previewLayer를 또 생성하지 않기 위해서 guard문을 사용해 nil값 여부를 판단하였습니다.
2. (`PayVC의 configureCancellable 함수 속`) 애니메이션 딜레이 방식 질문입니다.
- 10000원이 들어올때 별동별 애니메이션을 동시에 10개가 내리지 않고 시간차를 갖고 하나씩 내리게 하기 위해서 고민했습니다.
- 저희의 구조는 ViewModel의 총 금액에 해당하는 Wallet 변수를 Published로 구현하고 이를 ViewController 쪽에서 Subscribe하도록 되어있습니다. 따라서 10번 실행을 시키려면 ViewModel의 Wallet 값을 1000씩 10번 바꾸도록 되어있습니다.
- 처음 떠올린 방법은 Animate Delay 기능을 활용하여 몇번째 별인지 카운트 하면서 Animation에 delay를 주는 방식이었는데 위와 같은 구조 속에서는 ViewController쪽에서 몇번째 index인지를 판단해주는 변수를 관리해줘야했고 이게 비효율적이라 생각했습니다.
- 따라서 Custom Serial DispatchQueue 하나와 Thread.sleep을 활용하여 구현하였습니다. Thread sleep을 쓴다는게 조금 생소한 방법이여서 이와 같은 접근은 어떻게 생각하시는지 궁금합니다.