-
Notifications
You must be signed in to change notification settings - Fork 4
기술적 도전
Sun Kyung Kim edited this page Dec 15, 2022
·
5 revisions
Why
- Swift의 DatePicker를 사용해 캘린더를 구현할 수 있지만, 멀티터치 기능이 없어서 캘린더를 직접 구현하였습니다.
How
- UICollectionViewCompositionalLayout을 사용하여 Layout을 구현하였고, DiffableDatasource를 활용해 데이터를 제공하였습니다.
Why
- 현재 환율 정보를 받아오기 위해 네트워크 통신이 필요했습니다.
- 네트워크 통신이 00시~10시 사이에는 응답이 빈 배열로 오고, 일일제한 횟수가 1,000회로 제한이 있습니다.
- 00시~10시에 조회한다면 어제의 환율을 조회하는 방법을 사용할 수 있습니다.
- 1,000번 이상을 조회한다면 환율을 보여줄 방법이 없습니다.
- 환율은 계속해서 변동하는 값이지만, 앱의 기능을 사용하지 못하는 것 보단, 하루에 한 번 당일의 환율을 조회하는 것이 더 나은 방법이라고 생각을 해 캐시를 도입하게 되었습니다.
- 네트워크 통신도 안되고, 캐시에도 환율 정보가 없는 경우도 있습니다.
- 네트워크 통신이 안되어 앱을 이용할 수 없는 것 보다는 기본 환율 데이터를 보여주도록 구현하였습니다.
How
- FileManager를 사용해 DiskCache 구현
- NSCache를 사용해 MemoryCache 구현
→ 💰 캐시를 구현하면 네트워크 통신보다 얼마나 빠를까?
Why
- 외부 라이브러리를 지양하고 커스텀 뷰에 대해 깊게 공부하기 위해 원형 차트와 막대 차트를 직접 구현했습니다.
- 사용자에게 시각적 재미를 주기 위해 차트 애니메이션을 구현해 적용했습니다.
How
-
CALayer
와UIBezierPath
를 활용해 차트를 그리고,CAAnimation
을 활용해 애니메이션을 적용했습니다. - 원형 차트의 경우, 애니메이션이 순차적으로 동작하도록
CAAnimationDelegate
를 활용했습니다. - 지출 내역이 변경될 때마다 차트를 다시 그리고 애니메이션을 재실행하기 위해
setNeedsDisplay
를 활용했습니다.
Why
- 여행 기간 동안 일정이 계속 누적되어도 사용자는 최근 일정에만 관심 있을 확률이 높으므로 데이터를 효율적으로 불러오고 싶었습니다.
How
- fault를 기반으로 작동하는 CoreData의 특성을 활용해 그때그때 화면에 필요한만큼만 스냅샷에 새로 추가해 불필요한 fault-firing을 방지해 메모리를 절약했습니다.
Why
- UIVisualEffectView보다 처리 속도가 균일해 CIFilter를 사용했습니다.
How
- CIFilter는 사진 자체에 픽셀 단위로 연산하는 방식이기 때문에 처리할 얼굴의 개수와 이미지 크기에 따라 처리 시간이 급증하는 문제가 있었습니다.
- 따라서 다운샘플링을 통해 처리 속도를 이미지 크기와 무관하게 항상 2초대로 유지하도록 개선했습니다.
- 다운샘플링 과정에서의 메모리 스파이크를 최소화하기 위해 Image IO를 사용해 다운샘플링하고, 지나친 화질 저하를 막기 위해 UIImageView의 contentMode를 고려했습니다.
Why
사용자에게 이미지에 있는 얼굴을 인식하고, 모자이크 기능을 제공하기 위해서 애플이 제공하는 얼굴인식 서비스에 대해서 살펴보았습니다.
How
얼굴인식을 여러가지 방법이 있지만 그 중 두 가지가 대표적입니다.
- Vision Framework
- Core Image의 CIDetector
Vision Framework는 얼굴인식 정도가 정확하고, AI가 인식하는 아~ 이건 사람의 얼굴이다
하는 확신도를 통해서 데이터 처리가 가능한 장점이 있지만 이미지의 크기가 커질수록 속도가 느려진다는 단점이 있었습니다.
CIDetector는 Vision Framework에 비해 속도가 빠르지만 정확도를 높다, 낮다
두가지로만 처리할 수 있고, 얼마나 정확하게 얼굴을 인식했는지 처리 후 데이터를 이용할 수 없다는 단점이 있었습니다.
속도보다는 사진에 잘 나오지 않은 얼굴이라도 인식되는 것을 사용자가 경험하게 하고 싶었기에 Vision Framework를 사용하여 얼굴인식을 제공하였습니다.
→ 👨👩👦👦 Vision으로 얼굴인식하기
→ 🫥 CIDetector와 Vision… 무엇을 선택할까?