[240621] TIL

YoungHyun Kim·2024년 6월 21일
2

TIL ✍️

목록 보기
66/68

Coach!

  • 체육관 관장님이 인터벌 타이머를 사용해서 저를 굴리는 모습을 보고, 제가 직접 인터벌 타이머를 만들어서 사용하고 싶은 생각이 들어 제작하게 되었습니다.

기능

  • 인터벌 타이머 기능만을 가지고 있습니다.
  • 타이머가 시작된 이후에, 정지 버튼을 사용해서 타이머를 정지시킬 수 있습니다.
  • 일시정지, 재시작 기능이 추후 추가될 예정입니다.

어려웠던 점

  • 타이머가 표시되는 라벨의 내용을 언제 바꿔줘야 하는지 타이밍을 찾는 부분이 시간을 잡아먹었습니다.
    func startTimer(for state: TimerState, duration: Int) {
          let startTime = Date()
          self.timerTick?("\(String(format: "%02d", duration / 60)) : \(String(format: "%02d", duration % 60))")
          timer.invalidate()
          
          timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] timer in ...
          ...
          ...
    • timer 객체가 invalidate()메소드로 인해 작동이 정지될 때, 입력받은 duration(입력받은 운동시간, 쉬는시간 등의 값) 을 사용해서 타이머 라벨을 표시하게 했습니다.
  • 타이머 라벨의 업데이트와, 운동 완료 3초 전부터 울리는 사운드의 재생에 딜레이가 생겼습니다.
    • GCD를 사용해서 해결하려고 했습니다.
    DispatchQueue.main.async {
        self.timerTick?("\(String(format: "%02d", remainMin)) : \(String(format: "%02d", remainSec))")
    }
    DispatchQueue.global(qos: .userInteractive).async {
        self.playSound?("CoachReadySound")
    }
    • 타이머 라벨은 사용자가 계속해서 봐야하는 부분이기 때문에, main 스레드에서 작업하도록 구현했습니다.
    • 각 작업 종료 3초 전, 운동 시작, 쉬는 시간 시작 등의 타이밍에 작동하는 사운드 재생 함수는 qos: .UserInteractive의 qos값을 갖는 스레드에서 비동기로 작동하게 만들었습니다.

마치며

  • 혹시 인터벌 타이머가 필요하셨던 분들이 이 글을 보신다면... 사용해보고 싶으시다면... 며칠 후에 Apple App Store에 올라갈 수도 있으니... 댓글 달아주시면 배포된 다음 답글을 달도록 하겠습니다!
profile
iOS 개발자가 되고 싶어요

1개의 댓글

comment-user-thumbnail
2024년 6월 26일

멋쪄용

답글 달기