[ios] Swift에서 타이머 (이전의 NSTimer)를 사용하려면 어떻게해야합니까?

나는 시도했다

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
}