본문 바로가기

iOS

[iOS] DispatchSourceTimer로 일시정지 구현이 쉬운 타이머 만들기

  스택오버플로우에 일시정지와 재시작이 가능한 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는 계속 동작하고 있을 것입니다.

 

태그