我一直在努力争取从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")
}
答案 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()