当前位置: 首页 > 面试题库 >

快速计时器(以毫秒为单位)

潘哲
2023-03-14
问题内容

我想每毫秒更改一次计时器,但是它没有按预期工作。

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)";

 }

结果是

计时器以毫秒为单位更改为100(00: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版本如下所示:

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

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
  }
}


 类似资料:
  • 问题内容: 我通过传递ipAddress来对方法进行调用,它会返回ipAddress的位置,例如国家/地区,城市等。因此,我试图查看每个调用花费的时间。因此,我在调用方法之前设置了start_time,在调用之后设置了end_time。 所以有时候我得到的差为0 。并且resp包含有效的响应。 因此,这意味着有时需要0毫秒才能恢复响应。任何建议将不胜感激。 问题答案: 试试这个

  • 问题内容: 有什么办法可以使时间戳记中的毫秒数变为或(或出于好奇而使毫秒数)? 是否有这样的事情: 或者,唯一的选择是使用从? 问题答案: 在MySQL中 以秒 为单位获取Unix时间戳: 详细信息:http : //dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_unix- timestamp 未经测试的

  • 问题内容: 在我可以设置例如 是否有任何符号(%something)以毫秒为单位返回当前时间? 问题答案: 没有完全符合您需要的Log4J符号。 以给定的模式返回当前日期,该模式由(放在方括号之间的模式)定义,但是没有给您以毫秒为单位的时间。 给出自 执行开始以来的 毫秒数。 实现所需目标的一种可能方法是扩展Log4j的行为,这要复杂得多,但是如果绝对必要,请按以下步骤进行: 自定义log4j(编

  • 问题内容: Linux中是否有shell命令来获取时间(以毫秒为单位)? 问题答案: 返回秒数+当前纳秒。 因此,这就是您所需要的。 例: 返回自纪元以来的秒数(如果有用)。

  • 问题内容: 我的代码在这里: 在输出中毫秒数会给出错误的结果。请给出一个如何正确找到毫秒数的想法。 问题答案: Swift支持对浮点数进行余数计算,因此我们可以使用。 如: 结果: 斯威夫特4: 用:

  • 两个时间戳的示例 困难的部分原因是我认为没有类似的包来处理它。我不确定是否需要使用正则表达式来提取秒,然后将纳秒转换为毫秒。我愿意接受任何建议。 另外,您建议如何处理?我想我应该使用,然后像这样的包可以解析时间戳,甚至可以达到纳秒级的精度?