일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Method
- IOS
- Terminal
- initializer
- extension
- delegate
- UIKit
- Xcode
- Protocol
- tuist
- 스위프트
- property
- Class
- interpace
- instance
- Git
- url
- struct
- 디자인패턴
- 코딩테스트
- enum
- Swift
- init
- String
- Unicode
- initalizer
- type
- optional
- Foundation
- 이니셜라이저
- Today
- Total
아리의 iOS 탐구생활
[iOS] Timer를 간단히 사용해보기. 본문
타이머를 만들 수 있는 타입이다.
특정 시간이 지난 후 시작되어 지정된 메세지를 대상 객체로 보내는 타이머이다.
타이머는 Run Loop와 함께 작동하는데, Run Loop는 타이머에 대한 strong Reference를 유지하므로, Run Loop에 추가한 후 타이머에 대한 strong Reference를 유지할 필요가 없다.
타이머를 효과적으로 사용하려면 먼저 Run Loop가 작동하는 방법을 알아야 한다.
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
'Swift > iOS' 카테고리의 다른 글
[iOS/Swift] KVO(Key-value observing) (0) | 2021.10.20 |
---|---|
[iOS/Swift] Notification, NotificationCenter (0) | 2021.10.20 |
[iOS] local에 있는 오디오파일 재생하는 방법 (0) | 2021.09.28 |
[iOS] Bundle이 뭘까? (0) | 2021.09.28 |
[iOS/Xcode] Auto Layout에 대해 알아보자. (1) | 2021.09.27 |