아리의 iOS 탐구생활

[iOS] Timer를 간단히 사용해보기. 본문

Swift/iOS

[iOS] Timer를 간단히 사용해보기.

Ari Lee 2021. 9. 30. 14:39
반응형
 

Apple Developer Documentation

 

developer.apple.com

 

타이머를 만들 수 있는 타입이다. 

특정 시간이 지난 후 시작되어 지정된 메세지를 대상 객체로 보내는 타이머이다.

타이머는 Run Loop와 함께 작동하는데, Run Loop는 타이머에 대한 strong Reference를 유지하므로, Run Loop에 추가한 후 타이머에 대한 strong Reference를 유지할 필요가 없다.

 


타이머를 효과적으로 사용하려면 먼저 Run Loop가 작동하는 방법을 알아야 한다.

 

Introduction

Introduction Threads are one of several technologies that make it possible to execute multiple code paths concurrently inside a single application. Although newer technologies such as operation objects and Grand Central Dispatch (GCD) provide a more modern

developer.apple.com

Run Loop는 Thread와 관련이 있다. 

공부해보려고 했으나, 아직 내 수준에서는 이해하는데 어려움이 있다. 나중에 다시 상세히 공부해보는 걸로...
이 게시글에서는 타이머의 사용 방법만 익혀보도록 하겠다.

 


타이머를 생성할 때에는 반복 여부를 지정한다.

 

 

⏱ 반복 타이머 

  • 동일한 런 루프에서 특정 TimeInterval 간격으로 실행. 타이머 기능을 정지하려면 Invalidate() 메서드를 호출
let timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(fireTimer), userInfo: nil, repeats: true)

@objc func fireTimer() {
	print("타이머 시작!")
}

 

 

  • 클로저를 이용한 반복 타이머
let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
	print("타이머 시작!")
}​

 

 

 

 비 반복 타이머

한 번 실행된 다음 자동으로 무효화

@objc func fireTimer() {
	print("타이머 시작!")
}

let timer1 = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(fireTimer), userInfo: nil, repeats: false)
let timer2 = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { timer in
	print("타이머 시작!")
}


위와 같은 코드도 잘 작동하지만 GCD를 사용하면 동일한 작업을 수행할 수 있다. 타이머는 계속 감시해야하지만, GCD 한번만 실행되므로 훨씬 경제적이라고 있다.

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
	print("타이머 시작!")
}​

 

 

 

 

 타이머 종료

invalidate() 메소드를 호출하여 기존 타이머를 삭제할 수 있다.

예를들어 아래 코드는 “타이머 시작!”이라는 메세지를 1초에 1번씩 3번 출력 후 종료한다.

var runCount = 0

Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
    print("\(runCount)초.")
    runCount += 1

    if runCount == 3 {
        timer.invalidate()
    }
}

 

클로저가 아닌 메소드로 호출하려면 아래 코드를 참고하자.

var timer: Timer?
var runCount = 0

timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(fireTimer), userInfo: nil, repeats: true)

@objc func fireTimer() {
    print("\(runCount)초.")
    runCount += 1

    if runCount == 3 {
        timer?.invalidate()
    }
}

 

주요 프로퍼티

  • var isValid: Bool: 타이머가 현재 유효한지 아닌지 여부
  • var fireDate: Date: 다음에 타이머가 실행될 시각
  • var timeInterval: 타이머의 실행 시간 간격(초 단위)

 

Timer는 tolerance라는 프로퍼티를 제공한다. 이는 Timer가 이벤트를 발생시키는 것에 여유를 허용하므로써 시스템이 전원 관리와 반응성을 최적화 할 수 있게 해준다. 기본값은 0으로 시간이 되면 가능한 바로 이벤트를 발생시킨다는 뜻이다.

tolerance 설정되면 timer 이벤트를 발생시키는 시간은 (지정된 시간) ~ (지정된 시간 + tolerance) 사이가 된다. 만약 주기적인 Timer라면 다음 이벤트 발생 시간은 실제 이벤트 발생 시간이 아니라 원래 지정된 시간을 기준으로 설정된다. Apple 공식 문서에서 권장하는 tolerance 값은 최소 원래 간격의 10% 이상이다.

 

 

 

이렇게 간단한 사용방법만 알아보았다. 더 깊게 공부해보려면 RunLoop와 Thread 공부가 좀더 필요할 것 같다.

 

 

Reference

 

The ultimate guide to Timer

How to schedule timers, repeat timers, and more

www.hackingwithswift.com

 

Timer 사용하기

특정 시간이 지난 후에 이벤트를 발생시킨다거나, 반복적인 주기로 특정 작업을 수행하는 등의 행위는 프로그램에서 흔하게 필요로 하는 요구사항입니다. 이번 포스트에서는 이러한 상황에서

jcsoohwancho.github.io

 

반응형
Comments