当时间(iOS时钟)发生变化时,有没有办法运行代码?

时间:2016-12-05 20:51:18

标签: ios swift

当系统时钟发生变化时,是否还要运行代码?

例如:当时钟递增一分钟时,运行print(systemtime),即存储当前时间的变量。

这仅仅是出于我自己的测试目的,现在我有一个计时器,每分钟重复一次,获取当前时间并打印出来。

但是,我正在寻找一种方法print在适当的时间到控制台的时间,在iOS中。

从更一般的意义上讲,这是一种在iOS时钟发生变化时触发运行代码的方法。

2 个答案:

答案 0 :(得分:2)

总之,没有。 iOS上的实时时钟具有亚微秒的精度。它使用double来报告自iOS"纪元日期"以来的小数秒内的时间。

在某个任意间隔(60秒,秒)上调用函数不是系统函数。

也就是说,您可以设置与屏幕刷新同步的CADisplayLink(低开销计时器),并且当时间在一分钟变化的某个阈值内时#34; (例如)fmod(NSdate.timeIntervalSinceReferenceDate, 60) < 0.02您可以将消息记录到控制台。您需要使用阈值,因为您设置的任何间隔可能不会完全出现在所需的标记上。

修改

正如Matt在下面的评论中指出的那样,CADisplayLink可能会导致设备CPU运行热点&#34;并且比预期更快地耗尽电池。

如果你不需要毫秒级的精确度,那么做一些数学计算下一分钟几次并在适当的延迟后开始重复计时器可能是一个很好的折衷方案。像这样:

var timer: Timer?

func startMinuteTimer() {
  let now = Date.timeIntervalSinceReferenceDate
  let delayFraction = trunc(now) - now

  //Caluclate a delay until the next even minute
  let delay = 60.0 - Double(Int(now) % 60) + delayFraction

  DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
    self.timer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true) {
      timer in
      //Put your code that runs every minute here.
    }
  }
}

NSTimer(Swift 3中的计时器)的分辨率应该是大约1/50秒,因此代码应该在你的目标时间的0.02秒内得到你的更新。

此外,只要您的应用变为无效状态然后再次激活,您就必须杀死上述计时器并重新启动它,因为当您的应用未运行时它会暂停并且它不会被激活在几分钟内同步开火。

答案 1 :(得分:0)

我不相信有任何机制可以在系统时钟上创建触发器,但是你可以通过在应用程序启动时检查系统时钟来获得相同的效果,并启动一个在系统时钟时关闭的计时器会改变分钟。例如,如果时间是4:30:50,那么您可以启动一个在10秒后触发的计时器,这将在非常接近4:31:00发生。然后当它触发时,你只需立即启动另一个计时器1分钟。