使用NSTimer作为时钟运行定义的时间

时间:2015-07-21 05:53:51

标签: ios swift nstimer

我一直在努力争取从NSDate那里得到时间(就像时钟一样)但不幸的是,它并不像你想象的那么容易。是的,我也做谷歌,但我还没有找到一个可靠的解决方案。

这就是我正在做的事情。我从API获取当前日期和时间,因为我不能依赖本地日期时间,因为它可以通过设置进行更改。因此,我从API获取当前日期和时间并使用日期格式化器获得正确的格式并分配给NSTimer,然后分配给NSRunLoop,使其像时钟一样运行并每秒更新一次标签。

问题是,从我实现它的方式来看,我觉得因为我为fireDate分配的日期可能与当地时间不同而且它在时间上变得不匹配,所以循环只能根据本地日期时间,无论我从API得到什么输出。我觉得它将作为未来日期运行,所以请帮助我,下面给出了编写的代码。感谢。

let timeInterval: NSTimeInterval = 1.0
var dateFormatter = NSDateFormatter()
dateFormatter.timeZone = NSTimeZone(name: "GMT")

let serverNowDate: NSDate! = dateFormatter.dateFromString(DateTime.ServerNow())!
println("2015-07-21 11:06:31 am")

var timer = NSTimer(fireDate: serverNowDate, interval: timeInterval, target: self, selector: Selector("updateTimer:"), userInfo: nil, repeats: true) 

func updateTimer(timer:NSTimer!) //this doesn't get called
{
        var dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "hh:mm a"
        dateFormatter.timeZone = NSTimeZone(name: "GMT")
}

2 个答案:

答案 0 :(得分:1)

您的计时器未启动的原因是因为它未安排。您需要告诉NSTimer运行哪个runloop。为方便起见,Apple提供了一种返回预定计时器的方法:

class func scheduledTimerWithTimeInterval(_ seconds: NSTimeInterval,
                                   target target: AnyObject,
                                 selector aSelector: Selector,
                                 userInfo userInfo: AnyObject?,
                                  repeats repeats: Bool) -> NSTimer

另外我想说:

这可能不会做你想要的。我想你不要用“真实日期”显示时钟,但是没有代码可以实现这一点。

为了节省一些时间,您可以查看以下内容: https://github.com/jbenet/ios-ntp

这将为您提供可靠的时间信息,并且可以很方便地访问当前日期和时间。时间。

最后,我想告诉大家,你不应该在你的fire方法中实例化Dateformatters,因为它是一个非常重的对象来创建并且会非常负面地影响性能。您应该只创建一次并继续使用相同的实例。

答案 1 :(得分:0)

如果你想让计时器直接开火,你有什么理由不这样做吗?

    let timer = NSTimer(timeInterval: timeInterval, target: self, selector: "updateTimer:", userInfo: nil, repeats: true)
    timer.fire()