이번 주는 iOS 타이머 앱의 핵심 기능들을 개발하고 개선하는 작업을 진행했다. MVVM 아키텍처를 기반으로 시간 선택 UI 개선부터 알람 기능까지 다양한 기능을 구현하며 iOS 개발의 다양한 측면을 경험할 수 있었다.
private let timePickerView = UIPickerView()
private var hourArray: [Int] = Array(0...23)
private var minuteArray: [Int] = Array(0...59)
private var secondArray: [Int] = Array(0...59)
extension TimerView: UIPickerViewDelegate {
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
switch component {
case 0: viewModel.setHours(hourArray[row])
case 1: viewModel.setMinutes(minuteArray[row])
case 2: viewModel.setSeconds(secondArray[row])
default: break
}
}
}
viewModel.$hours
.combineLatest(viewModel.$minutes, viewModel.$seconds)
.receive(on: DispatchQueue.main)
.sink { [weak self] hours, minutes, seconds in
guard let self = self else { return }
if hours < self.hourArray.count {
self.timePickerView.selectRow(hours, inComponent: 0, animated: false)
}
// minutes, seconds 업데이트...
}
.store(in: &cancellables)
protocol TimerViewModelDelegate: AnyObject {
func showAlertViewController()
func alertViewControllerDidRequestSnooze(minutes: Int)
}
class TimerViewModel {
weak var delegate: TimerViewModelDelegate?
private var audioPlayer: AVAudioPlayer?
private func playTimerEndMusic() {
try? AVAudioSession.sharedInstance().setCategory(.playback, options: .mixWithOthers)
try? AVAudioSession.sharedInstance().setActive(true)
audioPlayer?.play()
}
}
private func setupComponents() {
// 컨테이너 배경색 변경
labelContainerView.backgroundColor = UIColor(red: 0/255, green: 38/255, blue: 77/255, alpha: 1)
musicContainerView.backgroundColor = UIColor(red: 0/255, green: 38/255, blue: 77/255, alpha: 1)
// 버튼 색상 변경
resetButton.backgroundColor = UIColor(red: 72/255, green: 144/255, blue: 216/255, alpha: 1)
playPauseButton.backgroundColor = UIColor(red: 0/255, green: 122/255, blue: 255/255, alpha: 1)
}
이번 프로젝트를 통해 가장 크게 느낀 점은 '사용자 경험'의 중요성이다. 처음에는 단순히 기능 구현에만 집중했었는데, PickerView 도입과 알람 기능 개선 과정에서 실제 사용자의 관점에서 생각해보는 계기가 되었다.
메모리 관리의 중요성
비동기 프로그래밍
UI/UX 디자인