Swift 使用计时器更新时间时,如何使时间与macOS系统时钟同步?

Swift 使用计时器更新时间时,如何使时间与macOS系统时钟同步?,swift,macos,timer,clock,Swift,Macos,Timer,Clock,我使用此代码在NSLabel中显示时间: 型号 func startClock() { timer = Timer(timeInterval: 1.0, target: self, selector: #selector(fireAction), userInfo: nil, repeats: true) RunLoop.current.add(timer!, forMode: RunLoop.Mode.common) timer?.tolerance = 0.05

我使用此代码在NSLabel中显示时间:

型号

func startClock() {
    timer = Timer(timeInterval: 1.0, target: self, selector: #selector(fireAction), userInfo: nil, repeats: true)
    RunLoop.current.add(timer!, forMode: RunLoop.Mode.common)
    timer?.tolerance = 0.05
    fireAction()
}

@objc dynamic func fireAction() {
    delegate?.timeToUpdateClock(self)
}
视图控制器

extension ViewController: ClockWorksProtocol {
    func timeToUpdateClock(_ timer: ClockWorks) {
        tick()
     }
}

 func tick() {
    clockDateLabel.stringValue = DateFormatter.localizedString(from: Date(), dateStyle: .full, timeStyle: .none)
    clockTimeLabel.stringValue = DateFormatter.localizedString(from: Date(), dateStyle: .none, timeStyle: .medium)
}
一切似乎都运行得很好,但不幸的是,显示的秒数与菜单栏上时钟上显示的秒数不同步。我认为这种情况会发生,因为我每秒钟更新一次时钟,但用户不会在第二秒正确开始时单击,而是在从第二秒到下一秒的时间间隔内(我使用的计时器时间间隔为1.0)

我可以将计时器的时间间隔从1.0秒更改为0.1秒。这似乎可行,但我担心这可能会消耗太多资源

我发布了两张同时拍摄的截图。它们显示两个不同的时间(秒):


我怎样才能弥补这一差距?

我知道您可以在这里采取两种方法:

  • 计算从现在到下一精确秒之间的时间量
    dt
  • 让nextSecond=floor(now.timeintervalencesince1970)+1
    设dt=nextSecond-now.timeintervalencesince1970
    
    制作一个计时器,从现在开始精确地触发一次
    dt
    。在该计时器的回调中,启动一个每隔1秒重复的计时器(每次执行
    tick()
    ),这正是
    startClock()
    函数所做的

    如果希望计时尽快开始,也可以在第一个计时器启动时运行
    tick()


  • 确定下一秒作为日期出现的时刻
  • Date(timeIntervalSince1970:floor(Date().timeIntervalSince1970)+1)

    将此初始化用于计时器,该计时器在特定的
    fireAt
    日期启动,并将其设置为每秒重复一次

    let timer=计时器(火警:
    日期(时间间隔自1970年起:
    楼层(日期().时间间隔自1970年起)+1),
    间隔:1.0,
    目标:自我,
    选择器:#选择器(fireAction),
    userInfo:nil,
    重复:正确)
    
    在什么意义上不同步<代码>日期()是时钟上的时间。现在,简单明了。我,马特,我编辑了这个问题,让它更清楚。谢谢。与其盲目重复计时器,不如看看现在是什么时间,并设置一个间隔,在下一秒开始时触发一次。嗨,马特,谢谢你的有用评论,你是不是很乐意创造一个答案,让我无法接受?如果您还可以添加一个示例来阐明您建议的技术。