반응형
스택오버플로우에 일시정지와 재시작이 가능한 Timer를 구현하는 방법에 대한 질문에 Timer를 invalidate 시켰다가 새로운 Timer를 할당하는 등의 까다로운 방법들로만 답변이 달린 것을 보았습니다.
내가 본 질문과 답변들..
Pausing and Resuming a Timer in iOS
Swift : Pause and Resume NSTimer
만약 DispatchSourceTimer를 알고 있더라면 좀 더 쉽게 해결가능한 문제입니다.
1초마다 시간을 출력해야 한다면 아래처럼 Timer를 만들 수 있습니다.
var timer: DispatchSourceTimer?
if timer == nil {
// 1
timer = DispatchSource.makeTimerSource(flags: [], queue: DispatchQueue.main)
// 2
timer?.schedule(deadline: .now(), repeating: 1)
// 3
timer?.setEventHandler(handler: {
print(Date())
})
}
1. Timer 생성자의 queue에는 원하는 작업이 UI와 관련되어 있다면 Main을 할당해주어야 합니다.
2. 바로 실행되어야 한다면 deadline에 .now()만 할당하면 되고, 3초 후에 실행되어야 한다면 .now() + 3 을 할당해주면 됩니다. 1초마다 반복되도록 repeating에는 1을 할당하였습니다.
3. Timer와 함께 연동될 EventHandler를 할당합니다.
// 시작
timer?.resume()
// 일시정지
timer?.suspend()
// 종료
timer?.cancel()
timer = nil
위처럼 Timer를 쉽게 컨트롤할 수 있는 API를 제공하고 있습니다.
Timer를 종료할 때는 Timer에 꼭 nil을 할당하여 메모리에서 해제시켜주어야 합니다.
그렇지 않으면 화면을 벗어나도 Timer는 계속 동작하고 있을 것입니다.
반응형
'iOS' 카테고리의 다른 글
[iOS] Custom ContainerViewController 활용시 주의할 점 (0) | 2021.08.29 |
---|---|
[iOS] Swift 참조 타입이 앱 기동 시간에 안 좋은 영향을 끼치는 이유 (번역) (1) | 2021.03.14 |
[iOS] 클래스의 모든 프로퍼티들이 궁금할 땐? (0) | 2020.02.29 |
[iOS] NSPredicate 문법 정리 (1) | 2020.01.27 |
[iOS] fullScreen? overFullScreen? over가 붙으면 무엇이 다를까 (UIModalPresentationStyle) (0) | 2020.01.15 |