본문 바로가기
iOS Swift/Study

[Swift] 알람앱 - 타이머(4) 상태변화에 따라서 UI 변경 및 로직 구현(시작, 일시정지, 재시작, 취소)

by 야고이 2024. 5. 16.
728x90
enum TimerState {
    case started
    case pause
    case resumed
    case canceled
    case finished
}

처음에는 케이스를 다섯개로 정했는데 사실 이렇게까지 필요 없었다

 

아래 세가지 경우만 있음

  1. 타이머가 실행 되지 않을 때
    • 시간을 지정하지 않은 디폴트 상태
    • 타이머를 취소 했을 때
  2. 타이머 실행
    • 시간 지정 후 실행
    • 일시 정지 후 실행
  3. 일시 정지

 

기존코드

// 기존코드
if !isTimerRunning {
   self.setTime = Int(timerDurationPicker.duration)
   timerLists.append(String(setTime))
   setTimer(with: setTime)
} else {
    self.isTimerRunning = false
    timer.invalidate()
    timerState = .pause
    updateTimerState()
}

이전에는 타이머가 실행 될 때와 아닐 때만 분류하려고 해서 Bool 값으로 하려고 했음

이렇게 하니 일시정지 후 재시작 하는 코드는 어디에 구현해야 할지 갈피를 못잡았다

 

// 수정된 코드
@objc func didTapStartButton() {
    print(#function)

    switch timerState {
    case .started, .resumed :
        timer.invalidate()
        timerState = .pause
        updateTimerState()
    case .pause:
        print("재실행")
        setTimer(with: setTime)
    case .canceled, .finished:
        self.setTime = Int(timerDurationPicker.duration) // 설정 된 시간
        timerLists.append(String(setTime))
        setTimer(with: setTime)
    }
}

로직 아이디어

타이머를 처음 시작하거나 재실행 했을 때 버튼을 누르면 타이머가 정지 됨.

이때 setTime 변수에 남은 시간이 저장됨

타이머를 재실행 (resumed)할 때 저장된 남은 시간을  타이머 실행 함수에 넣어서 호출함

멈춘 시간 부터 타이머가 실행 됨

 

 

p.s UI 를 반영하는 switch 문도 바꿔주면 코드가 줄어들 것 같다

728x90

댓글