Across 앱 개발 일기2 – 캘린더뷰

앱에서 표시할 일정과 할일은 애플 기본 캘린더와 미리알림 연동을 지원하는 EventKit 을 사용하기로 함
EventKit은 데이터의 안전한 저장, 읽기뿐 아니라 반복일정의 경우 스케쥴링까지 해줌.

아이폰 기본 캘린더와 미리알림이 월간 화면을 제공하지 않기 때문에 월간 화면에 일정과 할일을 표시하여 사용자들이 쉽게 사용할 수 있도록 하는게 이 앱의 목표임. 하지만 이미 수많은 동일한 목적의 앱들이 앱스토어에 많이 존재함.

그럼 뭐하러 개인적인 캘린더앱을 만들어서 출시도 하지 않고 6개월간 사용하고 있었을까?
– 월간뷰에 모든 일정이 다 표시되는 캘린더앱은 없음
– 미리알림 할일도 월간뷰에 함께 표시되는 앱이 거의 없음
– 종일일정과 시간일정이 월간뷰에서 명확히 구분되는 앱이 많지 않음
– 월간뷰 화면이 이쁘고 월별 빠른 이동이 자연스러운 앱을 사용하고자 함

한가지 더 월간뷰에서 상세 일정 확인이 좀 더 개선된 자연스러운 방식을 고민하다가
월간뷰에서 날짜를 터치했을 때 해당 날짜의 시간뷰가 아래로 펼쳐진 상태로 월간뷰 전체를 조회할 수 있는 UI를 구현해 봄.

정확히 생각한 대로 구현된 월간뷰에서 날짜 선택했을 때 보여지는 시간뷰

캘린더 화면 구성요소
CalendarView-UICollectionView-MonthCell-UITableView-WeekCell-TimeViewCell-EntriesView

2가지 중요한 요소가 있다.
– 월간뷰의 무한스크롤 (이전달, 다음달로 계속 무한히 이동할 수 있어야 함) –> UICollectionView
– 읽은 데이터(일정, 할일)들을 빠르고 정확하게 월간뷰 위에 표시 –> CoreGraphics

UICollectionView cellForItemAt, prefetchItemsAt 에서 데이터를 비동기로 메인스레드가 아닌 다른 스레드에서 읽는다.
이미 스크롤되어 지나가 표시가 필요없을 때는 UICollectionView cancelPrefetchingForItemsAt 을 호출하여 취소한다.
비동기로 읽을 때 여러 스레드에서 동시에 처리되는 것을 막기위해 시리얼 큐에 읽기 요청을 하고 실제 데이터를 가져오는 큐는 다수의 스레드에서 빠르게 읽을 수 있도록 한다. 데이터를 읽은 후 시리얼 큐에 다시 완료 요청하여 데이터를 읽는 쪽에서는 하나의 스레드에서 작동되는 것처럼 보인다. 데이터는 여러 스레드에서 읽고, 완료 처리는 하나의 큐(시리얼 큐)를 통해 하기 때문에 화면 갱신(Update)을 위한 멀티스레드 이슈는 발생되지 않는다.

데이터를 읽을때 각각 월별 단위로 데이터를 읽는다. 데이터 읽기 완료 후 화면뷰에 데이터를 표시하기 위해 화면뷰를 갱신한다.
화면뷰를 갱신하기 전에 여러개의 데이터가 표시될 지점을 미리 계산한 후 화면을 업데이트한다.

캘린더뷰에 표시되는 데이터들(일정, 할일)은 뷰(UIView)를 생성하여 추가되는 방식이 아닌 직접 그리는 방식이다.
속도면에서나 메모리 사용면에서나 CoreGraphics을 이용하여 무조건 직접 그리는 방식으로 해야만 한다. 직접 그리는 방식이 뷰를 만들어 추가하는 방식보단 친숙하지 않고 사용하기 불편하지만 성능을 위해선 필수 사항이다.

앱스토어) https://apps.apple.com/app/id6444851827

3 thoughts on “Across 앱 개발 일기2 – 캘린더뷰

  1. 안녕하세요 개발자님! 할 일 추가를 하려고 하는데 “에러: 저장 실패. 에러: 설정된 캘린더가 없습니다”라고 뜹니다. 노션에 기재된 도움말,팁을 봐도 잘모르겠네요..ㅎ…
    EventKit은 어플인가요?

    1. 안녕하세요. 제가 블로그를 잘 확인하지 않아서 질문주신지 좀 오래되었지만 이제라도 답변드립니다.
      앱내에서 할일은 미리알림과 연동되는데요. 미리알림이 저장되는 리마인더 리스트가 없는거 같습니다.
      앱내 메뉴 > 리마인더 리스트 에서 리스트 하나 만드시고 한번 해보세요.
      EventKit은 어플이 아니고 애플에서 지원하는 캘린더/미리알림 연동 라이브러리입니다.
      감사합니다.

      1. 안녕하세요 개발자님! 늦은 답변이라도 감사합니다:) 프리미엄 구매했습니다. 앞으로 좋은 어플 유지해주세요!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다