아래와 같은 옵션으로 생성한다면 타이머로써 Date Picker를 활용 할 수 있다
.countDownDuration: 타이머로 설정된 시간
enum TimerStatus {
case start
case pause
case end
}
switch문으로 Timer의 상태에 따라서 다양한 것들을 효과적으로 처리 할 수 있다
var timerStatus: TimerStatus = .end
switch self.timerStatus {
case .end:
//do something
case .start:
//do something
case .pause:
//do something
}
.setTitle(title: String?, for: UIControl.State): 버튼의 상태에 따라 버튼의 타이틀을 변경 할 수 있다.
공식 문서
Timer Class보다 일시정지와 재시작을 쉽게 할 수 있는 방법이다.
DispatchSourceTimer는 GCD API에서 제공된다.
우리가 작성한 코드는 cocoa에서 실행되는데, cocoa가 코드를 main Tread에서 호출하기 때문이다.
main thread는 인터페이스 thread라고도 불린다.
인터페이스에 접근하면 event는 main thread에 전달되고 우리가 적성한 코드는 이에 반응 한다. 인터페이스 관련된 코드들은 main thread에서 작성되어야 한다.
즉, 원하는 작업이 UI와 관련이 있다면 main을 할당해주어야 합니다.
makeTimerSource
schedule
setEventHandler
// 시작
timer?.resume()
// 일시정지
timer?.suspend()
// 종료
timer?.cancel()
timer = nil
Timer를 종료할 때는 Timer에 꼭 nil을 할당하여 메모리에서 해제시켜주어야 합니다. 그렇지 않으면 화면을 벗어나도 Timer는 계속 동작하고 있을 것입니다.
또한, suspend인 상태에서 cancel을 하면 에러가 발생하기 때문에 주의해야 한다. 반드시 resume 상태에서 cancel 시켜야 한다.
progress는 0~1로 나타낼 수 있고 float 형태이다. 0으로 가까워질수록 빈 bar가 되고 1에 가까울 수 록 bar가 채워진다.
iponeDev Wiki에서 아이폰 시스템 오디오의 soundID를 알 수 있다.
AudioServicesPlaySystemSound(inSystemSoundID: SystemSoundID)
0 ~ 1로 나타낼 수 있으며, 0에 가까울 수록 투명해진다.
cocoa가 코드를 main Tread에서 호출?
DispatchSourceTimer vs Timer
초단위 설정