iOS랑 친해지기

[iOS] 알람어플 만들기

데브킹덕 2022. 10. 24. 18:04

 

 

datePicker = 사용자가 타이머 시간을 선택할 수 있도록함

timerLabel = 시간을 나타내는 Label

progressView = 시간이 지날수록 1 ~ 0에 가까워짐

toggleButton = 시작을 누르면 타이머시간이 지나고 일시정지로 바뀜

dataPicker는 사라지고 Label과 progressView가 나타남

 

cancelButton = 취소 버튼을 누르면 Label과 progressView가 사라지고 dataPicker가 다시 생기고  Label과 progressView가 사라짐 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

👨‍💻만들어보면서 배운점

DispatchSourceTimer

- 타이머를 기반으로 이벤트 핸들러 블록을 제출하는 디스패치 소스 

- GCD API가 제공하는 프로토콜

- 1초에 한번씩 핸들러를 호출시켜서 데이트피커에서 설정한 시간이 카운트 다운되게 만들었고
   카운트다운된 시간을 라벨에 표시하고 카운트하도록 함 

 

 

Timer

- Swift에서는 특정 시간 간격이 경과한 후 실행되어 지정된 메시지를 대상 개체에 보내는 Timer 클래스를 제공함

 

GCD (Grand Central Dispatch)

- 애플에서 제공하는 API

- 쓰레드를 만들거나 관리해야하는 어려운 작업을 맡아서 해줌

- Task가 담긴 Queue를 만들고 GCD에 던져버리면 모든 스레드를 관리해줌

- 정리한번 꼭 해보기

 

 

 

- 타이머 시간을 초로 저장할 duration 변수를 생성

- 같은 주제로 연관된 데이터들을 멤버로 구성하는 TimerStatus 열거형을 생성

- timerStatus를 .end로 초기화해줌

- 현재 카운트 되고 있는 시간을 초로 저장하는 프로퍼티 currentSeconds

 

 

 

 

 

currentSeconds가 1초씩 줄도록하였고 시,분,초를 계산해 timerLabel에 나타나도록함

 

progressView는 Float형으로 1 ~ 0으로 줄어듦

 

DispatchSource.makeTimerSource

- 메인스레드에서 동작하도록 설정

 

schedule(deadline:repeating:leeway:)

- 어떤 주기로 타이머를 실행할것인지 설정

deadline - 디스패치 소스의 이벤트 핸들러를 실행할 절대 시간

repeating - 초단위  타이머 반복 간격

leeway - deadline이 타이머 이벤트 전달을 지연할 수 있는  최대 시간

 

setEventHandler(handler:)

- 디스패치 소스에 대한 이벤트 처리 등록

 

 

[weak self]

두가지  이상의 객체가 서로에 대한 강한참조 상태를 가지면 순환참조가 발생되면서 메모리 누수가 발생함

//일시적으로 약한 참조를 강한참조로 변환하고 싶을때
guard let self = self else{retrun}

 

 

animate(withDuration:animations:)

파라미터로 받은 에니메이션

 

 

CGAffineTransform 

- View의 프레임을 계산하지 않고 CGAffineTransform을 사용해 2D그래픽을 그릴 수 있음

 

 

 

AudioServicesPlayAlertSound(_:)

- currentSeconds가 0이되면 경고음이 울리도록함

- 깃허브 참고해 음을 골라 파라미터 작성

 

https://github.com/TUNER88/iOSSystemSoundsLibrary

 

GitHub - TUNER88/iOSSystemSoundsLibrary: List of all system sounds used in iOS

List of all system sounds used in iOS. Contribute to TUNER88/iOSSystemSoundsLibrary development by creating an account on GitHub.

github.com

 

 

alpha 값을 이용해 애니메이션 효과를 줌

.transform = .identity

- 이미지가 본상태로 돌아 올 수 있도록함

화면을 돌아가도 timer가 계속 동작할 수 있어 nil을 할당해 메모리 해제 할 수 있도록함

 

 

 

 

 

시작버튼을 누를경우 duration 을 .countDownDuration을 이용해 datePicker에 현재 선택된 값을 가져오도록함

timerstatus가 end, start, pause 일 경우를 따져 각 상태들을 바꾸도록함

종료시에는 데이트피커를 숨기고 timerLabel, progressView를 다시 보여줄 수 있도록함

카운트 다운 지속시간

- date picker에 의해 표시되는 값 

- 시간과 분으로 표시되지만 초단위로 측정됨

TimeInterval는 Double형이기 때문에 Int형으로 형변환

 

 

 

 

취소버튼을 눌렀을때 timerStatus가 시작이나 정지시 stopTimer 메서드 실행

 

 

 

 

토글버튼이 선택될경우와 아닐경우를 나누어 설정한 메서드 

 

 

 

 

 

취소 버튼이 눌렀을 경우 timertStatus의 경우에 따라 timerLabel, progressView를 숨기고 datePicker를 보여줄 수 있도록함