用毫秒创建倒数计时器(NSTimer),但它不能正确倒计数

问题描述:

我对Xcode(swift)很陌生,简而言之,我试图制作一个倒数计时器,倒计时秒数和小数点。用毫秒创建倒数计时器(NSTimer),但它不能正确倒计数

它倒计时,因为它应该,但是,例如,当我从13秒倒数,它真的需要23秒,当我手动计时。 这可能是一个简单的解决方案,但我已经尝试了很多东西,无法弄清楚如何解决它。

这里是我的代码:

import UIKit 

var timer = NSTimer() 

var seconds = 13 

var milliseconds = 0 

class ViewController: UIViewController { 

    @IBOutlet weak var Label: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     Label.text = "\(seconds).\(milliseconds)" 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    @IBAction func Button(sender: AnyObject) { 

     timer = NSTimer.scheduledTimerWithTimeInterval(0.001, target: self, selector: Selector("countDownfunction"), userInfo: nil, repeats: true) 

    } 


    func countDownfunction() { 

     Label.text = "\(seconds).\(milliseconds)" 

     if milliseconds == 0 { 

      seconds -= 1 
      milliseconds = 100 
     } else { 
      milliseconds -= 1 
     } 

    } 

} 

编辑:新的代码还没有计算出来,但是,正确的方式我想,我怎样才能。减去/像我一样在比较两个字符串:标签。 text =(countdownSeconds - elapsedTime) 它给了我一个错误,我不能' - '两个字符串,我不知道如何比较两秒钟。谢谢

import UIKit 

class ViewController: UIViewController { 


@IBOutlet weak var Label: UILabel! 

var startTime = NSDate.timeIntervalSinceReferenceDate() 

var currentTime = NSDate.timeIntervalSinceReferenceDate() 

var elapsedTime = String() 

var differenceTime = String() 

var countdownSeconds = String() 


override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 



@IBAction func Button(sender: AnyObject) { 
    countdownSeconds = String(10) 

    startTime = NSDate.timeIntervalSinceReferenceDate() 

    NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("countDownUpdateMethod"), userInfo: nil, repeats: true) 



} 

func countDownUpdateMethod(){ 

    currentTime = NSDate.timeIntervalSinceReferenceDate() 

    elapsedTime = String(currentTime - startTime) 



    Label.text = (countdownSeconds - elapsedTime) 



} 



} 
+0

'NSTimer'分辨率不够高 – dan

你忽略了它其实需要来安排和执行调用countDownfunction的时间。 NSTimer不会在恰好100毫秒内回拨您,因为手机正在做其他事情。这根本不会那么准确。此外,countDownfunction电话本身将需要时间,你没有考虑到这一点。

您应该通过记录开始时间和检查countDownfunction中的当前时间,然后减去两者来设置您的标签来解决此问题。这样可以弥补处理定时器的延迟。

您可以使用NSDate.timeIntervalSinceReferenceDate()获取当前时间。

+0

啊好吧,谢谢! – Josh

+0

@Josh如果您满意,请接受答案,谢谢。 –

+0

是的,我会的,我忘了,但我还没有完全弄清楚。 var Seconds从13开始倒计时,我将如何做,然后将其与NSDate.timeIntervalSinceReferenceDate()进行比较以确保其正确时间? – Josh

您是否注意到您将毫秒设置为100,而不是1000?

所以你的计时器在23秒内被调用约1300次。这听起来是正确的。是什么让你觉得每秒倒计数1000次是个好主意?人们看不到。

如果您阅读NSTimer的文档,重复计时器将尝试在预期时间触发(因此它们在最后一次触发后不会触发X秒,但会在计时器后触发X,2X,3X和4X秒)被启动),但是如果在给定时间内没有触发定时器,那么该触发器将被丢弃。因此,在23秒内,您的计时器不会触发23,000次,但会达到预期的1300次。您无法每秒更新屏幕1000次。如果可以的话,没有人能够看到它。

以合理的速度运行您的计时器,每秒不超过30次,并计算出时间。不是基于倒计时,而是基于实际时间。

+0

是的ganesher你是对的,我没有注意到这是100毫秒我的错误。但从我听说NSTimer不是很准确,所以我不想通过使用NSDate.timeIntervalSinceReferenceDate()来了解它更准确。我确实更新了新代码,你有时间查看吗?谢谢。 @ gnasher729 – Josh