[swift] PromiseKit를 활용한 앱 내 달력 및 일정 관리 기능

많은 사용자들이 일정을 효율적으로 관리하기 위해 달력 기능을 갖춘 앱을 선호합니다. 앱에서 일정을 추가하고 삭제하는 등의 기능은 비동기 작업을 필요로 합니다. 이런 비동기 작업을 관리할 수 있는 PromiseKit라는 라이브러리를 사용하여 앱 내 달력 및 일정 관리 기능을 구현해보겠습니다.

PromiseKit란?

PromiseKit는 비동기 작업을 관리하기 위한 Swift 프레임워크입니다. 이를 사용하면 비동기 작업의 성공과 실패에 따라 다른 작업을 수행할 수 있고, 오류 처리에 용이한 코드를 작성할 수 있습니다.

달력 기능

앱 내 달력 기능은 일정을 표시하고 편집할 수 있는 기능을 제공합니다. 달력을 표시하기 위해 FSCalendar라는 오픈 소스 라이브러리를 사용하겠습니다.

설치

먼저, PromiseKit와 FSCalendar를 프로젝트에 설치해야 합니다. CocoaPods를 사용할 경우, Podfile에 다음과 같은 의존성을 추가합니다.

pod 'PromiseKit'
pod 'FSCalendar'

그리고 터미널에서 pod install 명령을 실행하여 라이브러리를 다운로드하고 프로젝트에 연결합니다.

달력 UI 만들기

FSCalendar를 사용하여 달력을 표시하기 위해 먼저 FSCalendarDelegateFSCalendarDataSource 프로토콜을 구현해야 합니다. 이들 프로토콜은 달력의 셀 내용을 제공하고, 날짜 선택 등의 이벤트를 처리할 수 있게 해줍니다.

import FSCalendar

class CalendarViewController: UIViewController, FSCalendarDelegate, FSCalendarDataSource {
    @IBOutlet weak var calendarView: FSCalendar!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        calendarView.delegate = self
        calendarView.dataSource = self
    }
    
    // FSCalendarDelegate, FSCalendarDataSource 메서드 구현
    //...
}

달력의 디자인을 설정하려면 FSCalendarAppearance 객체를 사용합니다. 이 객체를 통해 색상, 폰트, 헤더 등을 설정할 수 있습니다.

func configureCalendarAppearance() {
    let appearance = calendarView.appearance
    
    appearance.headerTitleColor = .black
    appearance.weekdayTextColor = .gray
    appearance.titleDefaultColor = .black
    appearance.titleSelectionColor = .white
    // ...
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    configureCalendarAppearance()
    // ...
}

일정 관리 기능

PromiseKit를 사용하여 비동기 작업을 처리하는 일정 관리 기능을 구현해보겠습니다. 이 예시에서는 일정을 저장 및 불러오는 기능을 다루겠습니다.

func saveEvent(_ event: Event) -> Promise<Void> {
    return Promise { seal in
        // 일정 저장 로직
        
        // 성공적으로 저장되었을 때
        seal.fulfill(())
        
        // 저장 실패시
        seal.reject(PromiseError.eventSavingFailed)
    }
}

func loadEvents() -> Promise<[Event]> {
    return Promise { seal in
        // 일정 불러오기 로직
        
        // 일정 불러오기 성공시
        seal.fulfill(events)
        
        // 일정 불러오기 실패시
        seal.reject(PromiseError.eventLoadingFailed)
    }
}

위의 코드에서 Promise { seal in }을 사용하여 비동기 작업을 수행하고, seal.fulfill() 또는 seal.reject()를 호출하여 작업의 성공 또는 실패를 알릴 수 있습니다.

일정 추가 및 삭제

일정 추가와 삭제는 FSCalendar의 didSelectdidDeselect 이벤트에서 처리할 수 있습니다. 예를 들어, 일정 추가 화면으로 이동한 후 사용자가 일정을 추가하고 저장할 때, 다음과 같은 코드를 사용할 수 있습니다.

func addEvent() {
    // 일정 추가 화면으로 이동
    
    saveEvent(event)
        .done { _ in
            // 일정 저장 성공
            // 달력에 일정 표시
        }
        .catch { error in
            // 일정 저장 실패
            // 오류 처리
        }
}

일정 삭제는 FSCalendar의 didDeselect 이벤트에서 처리할 수 있습니다. 사용자가 일정을 선택한 후 삭제버튼을 누르면 다음과 같은 코드를 사용할 수 있습니다.

func deleteEvent() {
    // 선택한 일정 삭제
    
    deleteEvent(event)
        .done { _ in
            // 일정 삭제 성공
            // 달력에서 일정 제거
        }
        .catch { error in
            // 일정 삭제 실패
            // 오류 처리
        }
}

마무리

이렇게 PromiseKit를 사용하여 앱 내 달력 및 일정 관리 기능을 구현해보았습니다. PromiseKit를 활용하면 비동기 작업을 간편하게 처리할 수 있으며, 실패 시 오류 처리도 편리하게 할 수 있습니다. 앱에 달력 기능을 추가하여 사용자들이 일정을 효율적으로 관리할 수 있도록 도움을 줄 수 있습니다.

프로젝트의 전체 코드는 여기에서 확인할 수 있습니다.

참고 자료: