xcode – Swift计时器,以毫秒为单位

前端之家收集整理的这篇文章主要介绍了xcode – Swift计时器,以毫秒为单位前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想每毫秒更改一次计时器,但它不能按预期工作.
NSTimer.scheduledTimerWithTimeInterval(0.001,target: self,selector: Selector("advanceTimer:"),userInfo: nil,repeats: true);

func advanceTimer(timer: NSTimer){

    self.time += 0.001;

    let milliseconds = self.time * 100;
    let remaingMilliseconds = Int((milliseconds % 1000) / 10);
    let seconds = Int((milliseconds / 1000) % 60)

    let strSeconds = String(format: "%02d",seconds)
    let strFraction = String(format: "%02d",remaingMilliseconds)

    timerText.text = "\(strSeconds):\(strFraction)";

 }

结果是

计时器在毫秒部分(00:100)中更改为100,然后更改为01:00 = 40实际秒

邓肯方法

var time: NSTimeInterval = 0;
var startTime: NSTimeInterval = 0;

//And your  timer method...
func advanceTimer(timer: NSTimer){
    //Total time since timer started,in seconds
    self.time = NSDate.timeIntervalSinceReferenceDate() - startTime
    println(self.time);
    //The rest of your code goes here
}

override func didMoveToView(view: SKView) {

    // Set anchor point
    self.anchorPoint = CGPointMake(0.5,0.5);


    var startTime: NSTimeInterval
    //Sart the timer
    startTime = NSDate.timeIntervalSinceReferenceDate()
    NSTimer.scheduledTimerWithTimeInterval(0.02,repeats: true)
}

结果:456680125.54539第一次打印

解决方法

正如Martin在评论中所说,定时器的分辨率为50-100毫秒(0.05到0.1秒).尝试运行时间间隔短于此的计时器将无法提供可靠的结果.此外,计时器不是实时的.它们取决于它们所连接的运行循环,如果运行循环变忙,则计时器的触发会延迟.

不是每次计时器触发时都尝试递增计数器,而是在启动计时器时记录开始时间,然后进行一些数学计算以确定发生了多长时间:

var startTime: NSTimeInterval

//Sart the timer
startTime = NSDate.timeIntervalSinceReferenceDate()
NSTimer.scheduledTimerWithTimeInterval(0.02,repeats: true)


//And your  timer method...
func advanceTimer(timer: NSTimer)
{
  //Total time since timer started,in seconds
  self.time = NSDate.timeIntervalSinceReferenceDate() - startTime
  //The rest of your code goes here
 }

编辑:

代码的Swift 3版本如下所示:

(在测试项目中写为视图控制器)

class ViewController: UIViewController {

  weak var timer: Timer?
  var startTime: Double = 0
  var time: Double = 0

  @IBOutlet weak var timeValueLabel: UILabel!

  /* 
  When the view controller first appears,record the time and start a timer
  */
  override func viewDidAppear(_ animated: Bool) {
    startTime = Date().timeIntervalSinceReferenceDate
    timer = Timer.scheduledTimer(timeInterval: 0.05,selector: #selector(advanceTimer(timer:)),repeats: true)
  }

  //When the view controller is about to disappear,invalidate the timer
  override func viewWillDisappear(_ animated: Bool) {
    timer?.invalidate()
  }


  func advanceTimer(timer: Timer) {

    //Total time since timer started,in seconds
    time = Date().timeIntervalSinceReferenceDate - startTime

    //The rest of your code goes here

    //Convert the time to a string with 2 decimal places
    let timeString = String(format: "%.2f",time)

    //Display the time string to a label in our view controller
    timeValueLabel.text = timeString
  }
}
原文链接:https://www.f2er.com/iOS/330641.html

猜你在找的iOS相关文章