Skip to content

기술적 도전

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

  • CALayerUIBezierPath를 활용해 차트를 그리고, CAAnimation을 활용해 애니메이션을 적용했습니다.
  • 원형 차트의 경우, 애니메이션이 순차적으로 동작하도록 CAAnimationDelegate를 활용했습니다.
  • 지출 내역이 변경될 때마다 차트를 다시 그리고 애니메이션을 재실행하기 위해 setNeedsDisplay 를 활용했습니다.

📊 알고보면 어렵지 않은 커스텀 차트 만들어보기

🎬 CALayer에 CAAnimation 적용하기


일정이 무한 증식한다면? 도와줘 CoreData~

Why

  • 여행 기간 동안 일정이 계속 누적되어도 사용자는 최근 일정에만 관심 있을 확률이 높으므로 데이터를 효율적으로 불러오고 싶었습니다.

How

  • fault를 기반으로 작동하는 CoreData의 특성을 활용해 그때그때 화면에 필요한만큼만 스냅샷에 새로 추가해 불필요한 fault-firing을 방지해 메모리를 절약했습니다.

💽 CoreData 효율적으로 fetch하기


블러 처리? CoreImage한테 맡겨 달라고

Why

  • UIVisualEffectView보다 처리 속도가 균일해 CIFilter를 사용했습니다.

How

  • CIFilter는 사진 자체에 픽셀 단위로 연산하는 방식이기 때문에 처리할 얼굴의 개수와 이미지 크기에 따라 처리 시간이 급증하는 문제가 있었습니다.
  • 따라서 다운샘플링을 통해 처리 속도를 이미지 크기와 무관하게 항상 2초대로 유지하도록 개선했습니다.
  • 다운샘플링 과정에서의 메모리 스파이크를 최소화하기 위해 Image IO를 사용해 다운샘플링하고, 지나친 화질 저하를 막기 위해 UIImageView의 contentMode를 고려했습니다.

🏞 두근두근 이미지 이해하기


얼굴인식, Vision이냐 CIDetector냐

Why

사용자에게 이미지에 있는 얼굴을 인식하고, 모자이크 기능을 제공하기 위해서 애플이 제공하는 얼굴인식 서비스에 대해서 살펴보았습니다.

How

얼굴인식을 여러가지 방법이 있지만 그 중 두 가지가 대표적입니다.

  1. Vision Framework
  2. Core Image의 CIDetector

Vision Framework는 얼굴인식 정도가 정확하고, AI가 인식하는 아~ 이건 사람의 얼굴이다 하는 확신도를 통해서 데이터 처리가 가능한 장점이 있지만 이미지의 크기가 커질수록 속도가 느려진다는 단점이 있었습니다.

CIDetector는 Vision Framework에 비해 속도가 빠르지만 정확도를 높다, 낮다 두가지로만 처리할 수 있고, 얼마나 정확하게 얼굴을 인식했는지 처리 후 데이터를 이용할 수 없다는 단점이 있었습니다.

속도보다는 사진에 잘 나오지 않은 얼굴이라도 인식되는 것을 사용자가 경험하게 하고 싶었기에 Vision Framework를 사용하여 얼굴인식을 제공하였습니다.

👨‍👩‍👦‍👦 Vision으로 얼굴인식하기
🫥 CIDetector와 Vision… 무엇을 선택할까?


기타 기술 공유

🍎 IOyes 기술공유

Clone this wiki locally