gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:11:29 26 4
gpt4 key购买 nike

我正在使用这段代码在 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)
}

View Controller

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)
}

一切似乎都运行良好,但不幸的是,显示的秒数与您在菜单栏上的时钟中看到的秒数不同步。我认为会发生这种情况,因为我每秒更新一次时钟,但用户不会在第二秒正确开始时点击,而是在一秒和下一秒的偶然间隔内点击(我使用 timeInterval 作为 1.0 的计时器) .

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

我发布了两个同时制作的屏幕截图。它们显示两个不同的时间(秒):

enter image description here

enter image description here

我怎样才能弥补差距?

最佳答案

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

  1. 计算从现在到下一秒的时间dt
let nextSecond = floor(now.timeIntervalSince1970) + 1
let dt = nextSecond - now.timeIntervalSince1970

制作一个计时器,从现在起正好 dt 触发一次。在该计时器的回调中,启动一个以 1 秒为间隔重复的计时器(每次执行 tick()),这正是您的 startClock() 函数所做的。

如果您希望滴答尽快开始,您也可以在第一个计时器触发时运行 tick()


  1. 将下一秒发生的时刻确定为日期。

Date(timeIntervalSince1970: floor(Date().timeIntervalSince1970) + 1)

将此 init 用于计时器,它会在特定的 fireAt 日期启动它,并将其设置为每秒重复一次。

let timer = Timer(fireAt: 
Date(timeIntervalSince1970:
floor(Date().timeIntervalSince1970) + 1),
interval: 1.0,
target: self,
selector: #selector(fireAction),
userInfo: nil,
repeats: true)

关于swift - 使用计时器更新时间时,如何使时间与macOS系统时钟同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55383123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com