728x90
enum TimerState {
case started
case pause
case resumed
case canceled
case finished
}
처음에는 케이스를 다섯개로 정했는데 사실 이렇게까지 필요 없었다
아래 세가지 경우만 있음
- 타이머가 실행 되지 않을 때
- 시간을 지정하지 않은 디폴트 상태
- 타이머를 취소 했을 때
- 타이머 실행
- 시간 지정 후 실행
- 일시 정지 후 실행
- 일시 정지
기존코드
// 기존코드
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
'iOS Swift > Study' 카테고리의 다른 글
[Swift] 알람앱 - 타이머(6) 최근 타이머 목록 저장, 삭제, 실행 (0) | 2024.05.21 |
---|---|
[Swift] 알람앱 - 타이머(5) 테이블뷰 높이 동적으로 그리기 (0) | 2024.05.21 |
[Swift] 알람앱 - 타이머(3) - 타이머 초를 HH:MM:SS 포맷으로 보여주기 (0) | 2024.05.15 |
[Swift] 알람앱 - 타이머(2) - 초까지 나오는 타이머 라이브러리 사용하기 - DurationPicker (4) | 2024.05.14 |
[Swift] 알람앱 - 타이머(1) - 타이머 UI (0) | 2024.05.13 |
댓글