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,
            target: self,
            selector: Selector("advanceTimer:"),
            userInfo: nil,
            repeats: true)
}

结果:456680125.54539 第一个打印

最佳答案

正如 Martin 在他的评论中所说,计时器的分辨率为 50-100 毫秒(0.05 到 0.1 秒)。尝试以比该时间间隔更短的时间间隔运行计时器不会给出可靠的结果。此外,计时器不是实时的。它们依赖于它们所连接的运行循环,如果运行循环变得繁忙,定时器的触发就会延迟。

与其在每次计时器触发时都尝试增加计数器,不如在启动计时器时记录开始时间,然后进行一些数学运算以计算出已经过去了多少时间:

var startTime: NSTimeInterval

//Sart the timer
startTime = NSDate.timeIntervalSinceReferenceDate()
NSTimer.scheduledTimerWithTimeInterval(0.02, 
  target: self, 
  selector: Selector("advanceTimer:"), 
  userInfo: nil,
  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 版本如下所示:

(作为测试项目中的 View Controller 编写)

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,
                                 target: self,
                                 selector: #selector(advanceTimer(timer:)),
                                 userInfo: nil,
                                 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
  }
}

关于xcode - 以毫秒为单位的 Swift 定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30983111/

相关文章:

ios - UITableViewController 在具有有效数据的 reloadData 上导致 NSRangeException

ios - CardIO View 的框架

swift - 在 UIView 中跟踪多个手指

swift 调度队列 : Serial or parallel

swift - WKRefreshBackgroundTask 尝试访问文件时出错 bktasksnapshot_(null)

swift - 应用程序名称未显示在 xcode 控制台输出中

ios - Swift-如何在单击按钮时在自定义表格 View 单元格中获取标签值

ios - Xcode 4.3.1 iPad 模拟器与屏幕尺寸和多点触控相关的更改

ios - 将字符串/对象值传递给另一个 ViewController

iphone - 用于跳转到方法实现的 Xcode 快捷方式?