나는 시도했다
var timer = NSTimer()
timer(timeInterval: 0.01, target: self, selector: update, userInfo: nil, repeats: false)
그러나 오류가 발생했습니다.
'(timeInterval: $T1, target: ViewController, selector: () -> (), userInfo: NilType, repeats: Bool) -> $T6' is not identical to 'NSTimer'
답변
이것은 작동합니다 :
override func viewDidLoad() {
super.viewDidLoad()
// Swift block syntax (iOS 10+)
let timer = Timer(timeInterval: 0.4, repeats: true) { _ in print("Done!") }
// Swift >=3 selector syntax
let timer = Timer.scheduledTimer(timeInterval: 0.4, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)
// Swift 2.2 selector syntax
let timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: #selector(MyClass.update), userInfo: nil, repeats: true)
// Swift <2.2 selector syntax
let timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "update", userInfo: nil, repeats: true)
}
// must be internal or public.
@objc func update() {
// Something cool
}
Swift 4의 경우, 선택기를 가져 오려는 메소드는 Objective-C에 노출 @objc
되어야 하므로 메소드 선언에 속성을 추가해야합니다.
답변
반복되는 이벤트
다음 예제와 같이 타이머를 사용하여 작업을 여러 번 수행 할 수 있습니다. 타이머는 매 0.5 초마다 레이블을 업데이트하는 메소드를 호출합니다.
그 코드는 다음과 같습니다.
import UIKit
class ViewController: UIViewController {
var counter = 0
var timer = Timer()
@IBOutlet weak var label: UILabel!
// start timer
@IBAction func startTimerButtonTapped(sender: UIButton) {
timer.invalidate() // just in case this button is tapped multiple times
// start the timer
timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
}
// stop timer
@IBAction func cancelTimerButtonTapped(sender: UIButton) {
timer.invalidate()
}
// called every time interval from the timer
func timerAction() {
counter += 1
label.text = "\(counter)"
}
}
지연된 이벤트
타이머를 사용하여 나중에 일정 시간 동안 한 번만 이벤트를 예약 할 수도 있습니다. 위 예제와의 주요 차이점은 repeats: false
대신에 사용 한다는 것입니다 true
.
timer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(delayedAction), userInfo: nil, repeats: false)
위의 예제 delayedAction
는 타이머가 설정된 후 2 초라는 이름의 메서드를 호출합니다 . 반복되지는 않지만 timer.invalidate()
이벤트가 발생하기 전에 취소해야하는 경우 에도 전화를 걸 수 있습니다 .
노트
- 타이머 인스턴스를 여러 번 시작할 가능성이있는 경우 먼저 이전 타이머 인스턴스를 무효화해야합니다. 그렇지 않으면 타이머에 대한 참조가 없어지고 더 이상 중지 할 수 없습니다. ( 이 Q & A 참조 )
- 타이머가 필요 없을 때는 사용하지 마십시오. iOS 앱 에너지 효율 가이드 의 타이머 섹션을 참조하십시오 .
관련
답변
userInfo를 활용하여 Swift 4로 업데이트되었습니다.
class TimerSample {
var timer: Timer?
func startTimer() {
timer = Timer.scheduledTimer(timeInterval: 5.0,
target: self,
selector: #selector(eventWith(timer:)),
userInfo: [ "foo" : "bar" ],
repeats: true)
}
// Timer expects @objc selector
@objc func eventWith(timer: Timer!) {
let info = timer.userInfo as Any
print(info)
}
}
답변
iOS 10부터는 선택기를 사용하는 것보다 깨끗한 새로운 블록 기반 타이머 팩토리 방법이 있습니다.
_ = Timer.scheduledTimer(withTimeInterval: 5, repeats: false) { timer in
label.isHidden = true
}
답변
스위프트 3, iOS 10 이전
func schedule() {
DispatchQueue.main.async {
self.timer = Timer.scheduledTimer(timeInterval: 20, target: self,
selector: #selector(self.timerDidFire(timer:)), userInfo: nil, repeats: false)
}
}
@objc private func timerDidFire(timer: Timer) {
print(timer)
}
스위프트 3, iOS 10+
DispatchQueue.main.async {
self.timer = Timer.scheduledTimer(withTimeInterval: 20, repeats: false) { timer in
print(timer)
}
}
노트
- 메인 큐에 있어야합니다
- 콜백 함수는 공개, 비공개, …가 될 수 있습니다.
- 콜백 함수는
@objc
답변
확인 :
스위프트 2
var timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
스위프트 3, 4, 5
var timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)
답변
Swift 3에서 NSTimer 대신 Timer 를 사용해야 합니다.
예를 들면 다음과 같습니다.
Timer.scheduledTimer(timeInterval: 1,
target: self,
selector: #selector(YourController.update),
userInfo: nil,
repeats: true)
// @objc selector expected for Timer
@objc func update() {
// do what should happen when timer triggers an event
}